1267:【例9.11】01背包问题

发布时间:2022-06-08 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了1267:【例9.11】01背包问题脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

【题目描述】

一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1W2...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,...,Cn,求旅行者能获得最大总价值。

【输入】

第一行:两个整数,MM(背包容量,M<=200M<=200)和NN(物品数量,N<=30N<=30);

2..N+12..N+1行:每行二个整数WiCiWi,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,请注明来意。
标签: