背包问题

 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 }




原文地址:https://www.cnblogs.com/ht-beyond/p/4392095.html