背包问题总结
刷到背包了,背包是一类问题,开 个总 结记录贴 1 01 背包问题 题意:有N 件物品和一个容量为V 的背包。放入第i 件物品耗费的费用是Ci,得到的价值是Wi。求解将哪些物品装入背包可使价值总和最大 思路: 用子问题定义状态:即f[i,v] 表示前i 件物品恰放入一个容量为v 的背包可以获得的最大价值。则其状态转移方程便是: f[i,v]=max(f[i,v],f[i-1,v-ci]+wi) 伪代码 通过递减顺序V~0,我们可以在每个i循环完后得到最终的状态,即可以省略i 对于恰好装满背包,需要初始化为负无穷 对于只要求最大价值的,需要初始化为0 例题:poj 3624 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 int dp[13500]; 7 int w[13500],v[13500]; 8 int main() 9 { 10 int n,W; 11 #ifndef ONLINE_JUDGE 12 freopen("1.in","r",stdin); 13 #endif 14 while(scanf("%d%d",&n,&W)!=EOF) 15 { 16 int i,j,k; 17