dp--01背包,完全背包,多重背包

模板

for(int i = 0; i < n; i++)
{
    for(int j = m; j >= a[i].vol; j--)
    {
        dp[j] = max(dp[j],dp[j-a[i].vol]+a[i].val);
    }
}

例题     hdu2602

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 using namespace std;
 7 
 8 #define mem(a) memset(a,0,sizeof(a))
 9 #define ll long long
10 const int maxn = 1100;
11 
12 struct node
13 {
14     int val,vol;
15 } a[maxn];
16 int dp[maxn];
17 
18 int main()
19 {
20     //ios::sync_with_stdio(false);
21     //cin.tie(0),cout.tie(0);
22     int t,n,m;
23     scanf("%d",&t);
24     while(t--)
25     {
26         scanf("%d%d",&n,&m);
27         mem(dp);
28         for(int i = 0; i < n; i++)
29         {
30             scanf("%d",&a[i].val);
31         }
32         for(int i = 0; i < n; i++)
33         {
34             scanf("%d",&a[i].vol);
35         }
36         for(int i = 0; i < n; i++)
37         {
38             for(int j = m; j >= a[i].vol; j--)
39             {
40                 dp[j] = max(dp[j],dp[j-a[i].vol]+a[i].val);
41             }
42         }
43         printf("%d\n",dp[m]);
44     }
45     return 0;
46 }
hdu2602

   

完全背包:有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

模板

for(int i=1; i<=n; i++)
    {
    for(int j=w[i]; j<=V; j++)//唯一区别
    {     f[j]
=max(f[j],f[j-w[i]]+c[i]);

    }
  }

多重背包:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

posted on 2019-09-02 14:42  By_布衣  阅读(122)  评论(0编辑  收藏  举报

导航