码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 2602(01背包)

时间:2019-03-04 21:22:37      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:include   mes   开始   ace   就会   while   问题   sign   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背包)

标签:include   mes   开始   ace   就会   while   问题   sign   01背包   

原文地址:https://www.cnblogs.com/QingFengDaHui/p/10472875.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!