码迷,mamicode.com
首页 > 其他好文 > 详细

HDU3449 Consumer

时间:2019-08-26 00:57:22      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:std   通过   定义   bsp   lse   include   ref   false   win   

Topic Links

Topic Meaning:有n个箱子,每个箱子都有其相应花费box,箱子价值为0,对于每个箱子都有一些可以购买的珠宝,每个珠宝都有其花费和价值,只有在购买了箱子后才可以购买其相应珠宝,问在总花费不超过m元的情况下可得到的最大价值

Method of Solving:依赖背包

dp[i][j]定义为当花费为j时购买前i个箱子及其珠宝可得到的最大价值

对每一个箱子进行选择时首先对dp[i][j]进行初始化,即dp[i][1~box]=-1表示未购买箱子可得价值为空,而后使dp[i][j]=dp[i-1][j-box],使得dp[i][j]意为花费box购买第i个箱子以及花费j-box购前i-1个箱子及其珠宝可得到的最大价值,则可通过对第i个箱子的珠宝进行直接的状态转移得到符合定义的dp[i][j],在将dp[i][j]与dp[i][j-1]进行比较,使得所有的dp[i][j]符合定义;

#include<iostream>
using namespace std;
int n,m,dp[55][100005];
int main(){
    while(cin>>n>>m){
        int box,t,c,v;
        for(int i=1;i<=n;i++){
        cin>>box>>t;
        for(int j=0;j<=box;j++) dp[i][j]=-1;
        for(int j=m;j>=box;j--) dp[i][j]=dp[i-1][j-box];
        while(t--){
            cin>>c>>v;
            for(int j=m;j>=c;j--)
                if(dp[i][j-c]!=-1)
                dp[i][j]=max(dp[i][j],dp[i][j-c]+v);
        }
        for(int j=0;j<=m;j++) dp[i][j]=max(dp[i-1][j],dp[i][j]);
        }
        cout<<dp[n][m]<<endl;
    }
return 0;
}

  

 

HDU3449 Consumer

标签:std   通过   定义   bsp   lse   include   ref   false   win   

原文地址:https://www.cnblogs.com/WELOTX/p/11410034.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!