1267:【例9.11】01背包问题
一个旅行者有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn,求旅行者能获得最大总价值。
第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30);
第2..N+12..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。
仅一行,一个数,表示最大总价值。
······(此处省略999+字)
看了上面的内容,大家一定知道了什么是01背包了吧。
好,我们分析一下题目:
设f[i][v]表示前i件物品,总重量不超过v的最优值
所以:

则f[n][m]为最优解。
下面是代码环节:
#include<cstdio>
using namespace std;
const int maxm=201,maxn=31;
int m,n;
int w[maxn],c[maxn];
int f[maxn][maxm];
int max(int x,int y)
int max(int x,int y){
}
int main(){
}
这是主框架↑
顾名思义,有max函数,里面的代码,我就不多说了。
int max(int x,int y){
if(x<y) return y;
else return x;
}
main里的代码
int main(){
scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++) scanf("%d%d",&w[i],&c[i]);
//上面的是输入
for(int i=1;i<=n;i++){
for(int v=m;v>0;v--){
if(w[i]<=v) f[i][v]=max(f[i-1][v],f[i-1][v-w[i]]+c[i]);
else f[i][v]=f[i-1][v];
}
}
//
//f[i][v]表示前i件物品,总重量不超过v的最优值,套公式就可以
printf("%d",f[n][m]);
// f[n][m]为最优解。
return 0;
}
连起来的代码(图片):
当然这不是最好的方法。
更好的方法,代码当然少,不用写函数:
这个方法优化了空间复杂度,保对。
第一种方法↑
第二种方法↑
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!