hdu 3449Consumer(依赖背包)

src:http://acm.hdu.edu.cn/showproblem.php?pid=3449

dp值为-1不可转移(买不起对应的boxes),>=0可转移;

 

 

ac代码:

#include <iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<functional>
#include<utility>
#include<string>
#include<string.h>
#include<vector>
#include<iomanip>
#include<stack>
using namespace std;
#define FOR(i,a,b) for(int i=a;i<=b;i++)
const int inf=99999999;

int n,w,p,m,dp[55][100005],c,v;

int main()
{
    std::ios::sync_with_stdio(false);
    while(cin>>n>>w){
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++){
            cin>>p>>m;
            for(int k=0;k<p;k++)dp[i][k]=-1;//比p小的容量连盒子都买不起,因此不可转移
            for(int k=p;k<=w;k++)dp[i][k]=dp[i-1][k-p];//大于p的买了盒子,因此从[i-1][k-p]转移过来,
            for(int j=1;j<=m;j++){                //理解起来就是,只有p+1到w可以转移,也就是说只有w-p的代价可以使用
                cin>>c>>v;            //以上处理过后的dp[i]才是i物品要进行动态地规划的值
                for(int k=w;k>=c&&k>=p+c;k--){        //(即对于k空间我放了i物品后剩下的空间最多能放的东西减少了,理解见笔记的那幅图~~~
                    dp[i][k]=max(dp[i][k],dp[i][k-c]+v);
                }
            }
            FOR(k,0,w)dp[i][k]=max(dp[i][k],dp[i-1][k]);
        }
        cout<<dp[n][w]<<endl;
    }
    return 0;
}

 

posted @ 2018-05-01 21:15  WindFreedom  阅读(263)  评论(0)    收藏  举报