标签:box 箱子 int 花费 HDU3449 Consumer dp 珠宝
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; }
标签:box,箱子,int,花费,HDU3449,Consumer,dp,珠宝 来源: https://www.cnblogs.com/WELOTX/p/11410034.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。