原题链接:信息学奥赛一本通T1269-庆功会
解题思路:多重背包的模板题,就是在01背包的基础上多加了一个循环取奖品的个数
参考代码:
// // Created by 15420 on 2021/5/20. // #include <iostream> using namespace std; int n,m,v[510],w[510],s[510],dp[6600]; int main() { cin>>n>>m;//n代表希望购买的奖品的种数,m表示拨款金额。 for (int i = 1; i <=n ; ++i) { cin>>v[i]>>w[i]>>s[i];//分别表示第I种奖品的价格、价值(价格与价值是不同的概念)和能购买的最大数量(买0件到s件均可) } for (int i = 1; i <=n ; ++i) {//其实就是01背包多加了一个循环取奖品的个数 for (int j = m; j >=1 ; --j) { for (int k = 0; k <=s[i]&&j>=k*v[i] ; ++k) {//购买奖品的个数不能超过s[i]个,取k个i物品价值不能超过总价值 dp[j]=max(dp[j],dp[j-k*v[i]]+k*w[i]);//这里是取和不取k个奖品那个更好 } } } cout<<dp[m];//最后输出奖品的最大总价值 return 0; }
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复