基本概念
01背包是背包问题中最简单的问题。01背包的约束条件是给定几种物品,每种物品有且只有一个,并且有权值和体积两个属性。在01背包问题中,因为每种物品只有一个,对于每个物品只需要考虑选与不选两种情况。如果不选择将其放入背包中,则不需要处理。如果选择将其放入背包中,由于不清楚之前放入的物品占据了多大的空间,需要枚举将这个物品放入背包后可能占据背包空间的所有情况。
状态转移方程
1 f[i, j] = max( f[ i-1 ][ j-W[ i ] ] + P[ i ] , f[ i-1 ][ j ] )//j >= W[ i ]
已经AC的HDU2602
1 #include <iostream>
2 #include <cstdio>
3 #include <string>
4 #include <cstring>
5 #include <algorithm>
6 using namespace std;
7
8 int v[1005],w[1005];
9 int dp[1005][1005];
10 int max(int x,int y)
11 {
12 return x>y?x:y;
13 }
14 int main()
15 {
16 int t,n,V,i,j;
17 scanf("%d",&t);
18 while(t--)
19 {
20 scanf("%d%d",&n,&V);
21 for(i=1;i<=n;i++)
22 scanf("%d",&w[i]);
23 for(i=1;i<=n;i++)
24 scanf("%d",&v[i]);
25 memset(dp,0,sizeof(dp));
26 for(i=1;i<=n;i++)
27 for(j=0;j<=V;j++)
28 {
29 if(v[i]<=j)
30 dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);
31 else
32 dp[i][j]=dp[i-1][j];
33 }
34 cout << dp[n][V] << endl;
35 }
36
37 return 0;
38 }
1 #include <iostream>
2 using namespace std;
3 int main()
4 {
5 int t;cin>>t;
6 while(t--)
7 {
8 int n,va,w[10005]={0},v[10005]={0},f[10005]={0};
9 cin>>n>>va;
10 for(int i=0;i<n;i++) cin>>w[i];
11 for(int i=0;i<n;i++) cin>>v[i];
12 for(int i=0;i<n;i++)
13 for(int j=va;j>=v[i];j--)
14 f[j]=max(f[j],f[j-v[i]]+w[i]);
15 cout<<f[va]<<endl;
16 }
17 return 0;
18 }