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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
完全背包:有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]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。