标签:
1 /* 2 2015.4 HT 3 背包问题 4 f[i][v] : 前i件物品放到一个容量为v的背包中可以获得最大价值 5 状态转移方程: f[i][v] = max(f[i - 1][v],f[i - 1][v - weight[i]] + cost[i]) 6 7 */ 8 #include <iostream> 9 using namespace std; 10 11 const int N = 3;//物品个数 12 const int V = 5;//背包最大容量 13 int weight[N + 1] = { 0, 3, 2, 2 }; 14 int value[N + 1] = { 0, 5, 10, 30 }; 15 int f[N + 1][V + 1] = { { 0 } }; 16 17 int Max(int x, int y) 18 { 19 return x > y ? x : y; 20 } 21 int Knapsack() 22 { 23 memset(f, 0, sizeof(f)); 24 for (int i = 1; i <= N; i++) //枚举物品 25 { 26 for (int j = 0; j <= V; j++) //枚举背包容量 27 { 28 f[i][j] = f[i - 1][j]; //前i - 1件物品放到容量为v的背包中,带来的收益 29 if (j >= weight[i]) //可以容下该重量 30 { 31 f[i][j] = Max(f[i - 1][j], f[i - 1][j - weight[i]] + value[i]); 32 } 33 } 34 } 35 return f[N][V]; 36 } 37 int main() 38 { 39 cout << Knapsack() << endl; 40 return 0; 41 }
http://acm.hdu.edu.cn/showproblem.php?pid=2191
1 /* 2 2015.4 HT 3 换成使用一位数组 4 http://acm.hdu.edu.cn/showproblem.php?pid=2191 5 输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数n和m(1<=n<=100, 1<=m<=100), 6 分别表示经费的金额和大米的种类,然后是m行数据,每行包含3个数p,h和c(1<=p<=20,1<=h<=200,1<=c<=20), 7 分别表示每袋的价格、每袋的重量以及对应种类大米的袋数。 8 9 f[v] = max(f[v], f[v-c[i]])相当于我们的转移方程f[i][v] = max(f[i-1][v],f[i-1][v-c[i]]) 10 */ 11 12 #include <iostream> 13 #include <string.h> 14 #include <algorithm> 15 using namespace std; 16 #define MAX 20 17 int value[MAX], weight[MAX],bagnum[MAX], F[MAX]; 18 19 int main() 20 { 21 int T, nValue, nKind; 22 cin >> T; 23 while (T--) 24 { 25 memset(F, 0, sizeof(F)); 26 cin >> nValue >> nKind; 27 for (int i = 0; i < nKind; i++) 28 { 29 cin >> value[i] >> weight[i] >> bagnum[i]; 30 } 31 for (int i = 0; i < nKind; i++) 32 for (int j = 0; j < bagnum[i]; j++) 33 for (int k = nValue; k >= value[i]; k--) 34 F[k] = max(F[k], F[k - value[i]] + weight[i]); 35 cout << F[nValue] << endl; 36 } 37 return 0; 38 }
标签:
原文地址:http://www.cnblogs.com/ht-beyond/p/4392095.html