多重背包
#include<iostream>//01背包问题状态转移方程dp[i][j]=max(dp[i-1 ][j],dp[i-1][j-w[i]]+p[i])区别:因为物品只能装一次所以在比较装入物品后的价值时使用i-1而不是i因为物品只能装一次 using namespace std; int main(){ int dp[101][101]={}; int n,c;//物品种类数,背包容量 int w[101]={};//重量 int p[101]={};//价值 int k[101]={};//数量 cin>>n>>c; for(int i=1;i<=n;i++){ cin>>w[i]>>p[i]>>k[i]; } for(int i=1;i<=n;i++){ for(int j=1;j<=c;j++){ dp[i][j]=dp[i-1][j];//不放入 for(int ij=1;ij<=k[i];ij++){//各种数量的情况 if(j>=ij*w[i]){//当容量大于数量*重量时比较不放入和放入谁最优 dp[i][j]=max(dp[i][j],dp[i-1][j-ij*w[i]]+ij*p[i]);//状态转移方程 'dp[i][j]'15行已考虑全部不放入的情况,但是多重背包会多次放数量不同的物品所以当ij=1且dp[i-1][j-ij*w[i]]+ij*p[i]>dp[i-1][j]时最优选择不为dp[i-1][j]然而还要考虑i=2,i=3......所以此时要和dp[i][j]比较 cout<<dp[i][j]<<endl; } } } } cout<<dp[n][c]<<endl;//最终值 return 0; } /*3 13 2 4 8 3 7 2 4 10 1 29 */
#include<iostream>//01背包问题状态转移方程dp[i][j]=max(dp[i-1 ][j],dp[i-1][j-w[i]]+p[i])区别:因为物品只能装一次所以在比较装入物品后的价值时使用i-1而不是i因为物品只能装一次 using namespace std;int main(){ int dp[101][101]={}; int n,c;//物品种类数,背包容量 int w[101]={};//重量 int p[101]={};//价值 int k[101]={};//数量 cin>>n>>c; for(int i=1;i<=n;i++){ cin>>w[i]>>p[i]>>k[i]; } for(int i=1;i<=n;i++){ for(int j=1;j<=c;j++){ dp[i][j]=dp[i-1][j];//不放入 for(int ij=1;ij<=k[i];ij++){//各种数量的情况 if(j>=ij*w[i]){//当容量大于数量*重量时比较不放入和放入谁最优 dp[i][j]=max(dp[i][j],dp[i-1][j-ij*w[i]]+ij*p[i]);//状态转移方程 'dp[i][j]'15行已考虑全部不放入的情况,但是多重背包会多次放数量不同的物品所以当ij=1且dp[i-1][j-ij*w[i]]+ij*p[i]>dp[i-1][j]时最优选择不为dp[i-1][j]然而还要考虑i=2,i=3......所以此时要和dp[i][j]比较cout<<dp[i][j]<<endl;} }} } cout<<dp[n][c]<<endl;//最终值 return 0;}/*3 132 4 83 7 24 10 1
29*/
posted on 2022-08-20 11:52 AndyYuanShaojun 阅读(25) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人