Problem Description
一个旅行者有一个最多能装M公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...Cn,求旅行者能获得最大总价值。
Input
输入有多组数据,对于每组输入数据第1行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30);
第2行至N+1行:每行两个整数Wi,Ci,表示每个物品的重量和价值。
第2行至N+1行:每行两个整数Wi,Ci,表示每个物品的重量和价值。
Output
对于每组输入输出一个数,表示最大总价值。
Sample Input
10 4 2 1 3 3 4 5 7 9
Sample Output
12
/* 前i件物品放入v容量的背包。考虑第i件物品放还是不放 放 --- > 前i-1件放入容量为v-w[i]背包中 f[i-1][v] 不放 --- > 前i-1件放入容量为v背包中 f[i-1][v-w[i]]+c[i] */ #include<iostream> // 二维数组 using namespace std; int main() { int n,m,w[35],c[35],f[35][205]={0},i,v; while(cin>>m>>n) // m为背包容量 n件物品 { for(i=1;i<=n;i++) { cin>>w[i]>>c[i]; // n件物品的重量,价值 } for(i=1;i<=n;i++) // f[i][v]为前i件物品,总量不超过v的最优解 for(v=m;v>0;v--) if(w[i]<=v) { if(f[i-1][v]>f[i-1][v-w[i]]+c[i]) f[i][v]=f[i-1][v]; else f[i][v]=f[i-1][v-w[i]]+c[i]; } else f[i][v]=f[i-1][v]; cout<<f[n][m]<<endl; // f[n][m]为最优解 } return 0; } // 一维数组 #include<iostream> using namespace std; int main() { int n,m,w[35],c[35],f[205]={0},i,v; while(cin>>m>>n) // m为背包容量 n件物品 { for(i=1;i<=n;i++) cin>>w[i]>>c[i]; // n件物品的重量,价值 for(i=1;i<=n;i++) for(v=m;v>=w[i];v--) // f[v] 为重量不超过v的最优解 if(f[v]<f[v-w[i]]+c[i]) f[v]=f[v-w[i]]+c[i]; cout<<f[m]<<endl; } return 0; }