脚本宝典收集整理的这篇文章主要介绍了1267:【例9.11】01背包问题,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,...,Cn,求旅行者能获得最大总价值。
第一行:两个整数,MM(背包容量,M<=200M<=200)和NN(物品数量,N<=30N<=30);
第2..N+12..N+1行:每行二个整数Wi,CiWi,Ci,表示每个物品的重量和价值。
仅一行,一个数,表示最大总价值。
10 4 2 1 3 3 4 5 7 9
12这道题是背包问题的一种,在01背包问题中,我们有多个物品,但每种物品只有一个,在不超过背包承重的情况下,求出所有物品的最大值。这道题我们首先要输入物品的个数和背包的承重,然后再输入物品的重量和价值。然后我们需要创建一个二维数组来推这道题的最优解。在求最大值的过程中,我们要判断此时的背包是否放得下这个物品,如果放不下,那么略过这个物品,照抄上一行,在看下一个物品。如果放得下,那么我们需要用到max函数,来求释放这个物品的价值大还是不放大。最后输出这个二维数组的最后一个数据就可以了。AC代码奉上:
#include <iostream>
#include <cstdio>
using namespace std;
#define M 1000
int f[M][M], ans;
int v, m, c[M], w[M];
int main() {
scanf("%d%d", &v, &m);
for(int i = 1; i <= m; i++) scanf("%d%d", &c[i], &w[i]);
for(int i = 1; i <= m; i++)
for(int j = 0; j <= v; j++) {
if(j >= c[i]) f[i][j] = max(f[i-1][j], f[i-1][j-c[i]]+w[i]);
else f[i][j] = f[i-1][j];
}
printf("%dn", f[m][v]);
return 0;
}
以上是脚本宝典为你收集整理的1267:【例9.11】01背包问题全部内容,希望文章能够帮你解决1267:【例9.11】01背包问题所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。