01背包

基本概念

    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 }

 


posted @ 2017-04-28 11:43  TTTCoder  阅读(241)  评论(0编辑  收藏  举报