经典01背包问题(C++)--详解
二维数组解决01背包问题
题目:
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
//01背包问题 //【二维数组】求解背包问题 //1.二维数组 #include <iostream> #include <algorithm>//为调用max函数 using namespace std; int n,v1;//n为物品数量,v1为背包大小 int f[1005][1005];//n件物品放到容量为v1的背包里的最优解 int v[1005];//物品体积数组 int w[1005];//物品价值数组 int main() { cin>>n>>v1;//输入物品数量,背包大小 for(int i=1;i<=n;i++){ cin>>v[i]>>w[i]; } for(int i=1;i<=n;i++){//读取物品 for(int j=1;j<=v1;j++){//背包容量逐渐增加 if(j<v[i])//如果背包容量小于物品体积 //则第i件物品无法装进去。 //所以i的最优解与i-1件物品的最优解相同。 f[i][j]=f[i-1][j]; else /*第i件物品可以装进去,则判断装与不装谁最优 因为对所有物品只有装与不装 1,不装:不装的话与上面相同,f[i][j]=f[i-1][j]; 2,装;f[i][j]=f[i-1][j-v[i]+w[i]; f[i-1][j-v[i]]是在第i件物品之前的最优解,即i-1的最优解 , "-v[i]"是因为需要为第i件物品空出空间,"+w[i]"是把第i件物品选中; */ f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]); } } cout<<f[n][v1]; /*对应上边 "int f[1005][1005];//n件物品放到容量为v1的背包里的最优解 ", f[n][v1]表示为"n件物品放到v1背包最优解" */ return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异