hdu 2602(01背包)

Posted qingfengdahui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 2602(01背包)相关的知识,希望对你有一定的参考价值。

01背包:有N件物品和一个容量为V 的背包。放入第i件物品耗费的空间是Ci,得到 的价值是Wi。求解将哪些物品装入背包可使价值总和最大。(每件物品只有一件,放或者不放)

即F[i,v]表示前i件物品恰放入一个容量为v的背包可以 获得的最大价值。则其状态转移方程便是:
F[i,v] = max{F[i−1,v],F[i−1,v−Ci] + Wi}

我们可以做一点空间上的优化,用F[v]表示当前v空间所获得的最大价值,则F[v]=max(F[v],F[v-Ci]+W[i]);

这里要注意一个问题,空间优化时第二层循环一定要从V开始,因为如果从Ci开始的话,F[v]就可能由F[i,,v-Ci]推出,答案可能就会错

 1 #include<iostream>
 2 #include<string.h>
 3 #include<string>
 4 #include<sstream>
 5 #include<vector>
 6 #include<deque>
 7 #include<map>
 8 #include<algorithm>
 9 #include<iomanip>
10 #include<math.h>
11 #include<set>
12 using namespace std;
13 
14 int maxn = 0x3f3f3f3f3f;
15 typedef long long ll;
16 typedef unsigned long long ull;
17 
18 int dp[1005];
19 int val[1005], v[1005];
20 int main()
21 {
22     int t;
23     cin >> t;
24     int n,V;
25     while (t--)
26     {
27         cin >> n>>V;
28         for (int i = 1; i <= n; i++)
29             scanf_s("%d", &val[i]);
30         for (int i = 1; i <= n; i++)
31             scanf_s("%d", &v[i]);
32         memset(dp, 0, sizeof(dp));
33         for (int i = 1; i <= n; i++)
34         {
35             for (int j = V; j >=v[i]; j--)
36             {
37                 dp[j] = max(dp[j], dp[j - v[i]] + val[i]);
38             }
39         }
40         cout << dp[V] << endl;
41     }
42     return 0;
43 }

 

以上是关于hdu 2602(01背包)的主要内容,如果未能解决你的问题,请参考以下文章

HDU2602(01背包)

HDU 2602 Bone Collector (01背包问题)

HDU 2602 Bone Collector(01背包)

HDU 2602 Bone Collector(01背包)

hdu2602 Bone Collector 01背包

hdu 2602 Bone Collector 01背包模板