01背包:
有N件物品和一个容量为V的背包,放入第I件物品耗费的费用是wi,得到的价值是ci。求解哪些物品装入背包可以使价值总和最大?
//二维01背包:
f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+c[i])
//一维01背包:
for(int i=1;i<=n;i++)//物品种类
for(int j=m;j>=w[i];j--)//背包容量
f[j]=max(f[j],f[j-w[i]]+c[i]);
:空间优化后的代码
#####################01背包要求全部装满########################
1)背包求最大价值时边界直接将数组初始化全部置0;
2)考虑“刚好装满条件”:
一开始背包承重为0这种情况满足“装满条件”则f[0]=0;
背包承重为j(j!=0)但不满足则f[j]=-0x3f3f3f3f//不可以赋值为0
max 除了dp[0]=0 其他初始化为-0x3f3f3f3f
min 除了dp[0]=0 其他初始化为0x3f3f3f3f
不必恰好装满,全初始化为0
//####################>例题:
题目描述
Joe觉得云朵很美,决定去山上的商店买一些云朵,
商店里有n朵云,云朵被编号为1,2,……n,并且每朵云都有一个价值。
但是商店老板跟他说,一些云朵要搭配来买才好,所以买一朵云则与这朵云有搭配的云都要买,
但是Joe的钱有限,所以他希望买的价值越多越好。
输入:
第1行n,m,w表示n朵云,m个搭配,Joe有w的钱。
第2至n+1行,每行ci,di表示i朵云的价钱和价值。
第n+2至n+1+m行,每行ui、vi表示买ui必须买vi,同理,如果买vi就必须买ui。
30%的数据满足:n<=100;
50%的数据满足:n<=1000;m<=100;w<=10000;
100%的数据满足:n<=10000;0<=m<=5000;w<=10000;
输出:
一行,表示可以获得的最大价值
+=====================================================
提示:并查集
1):
int fa[1000]
int init(){for(int i=1;i<=n;i++)fa[i]=i;
}
2):路径压缩:
int fd(int x){if(fa[x]!=x)return f[x]=fd(fa[x])else return x;
}
样例程序如下:
#include<bits/stdc++.h>
#define quickly() ios::sync_with_stdio(false);cin.tie(0);cou