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 }