c++背包九讲之二维费用背包问题

雨燕双飞 提交于 2019-11-30 03:17:19

一、背包九讲总述

关于动态规划问题,最典型的就是背包九讲,先理解背包九讲后再总结关于动态规划的问题

1、01背包问题
2、完全背包问题
3、多重背包问题
4、混合背包问题
5、二维费用的背包问题
6、分组背包问题
7、背包问题求方案数
8、求背包问题的方案
9、有依赖的背包问题
往前四篇博文已经介绍了前四个问题,有需要的同学可以看一下!!

二、二维费用背包问题
二维费用的背包问题是指:对于每件物品,具有两种不同的费用,选择这件物品必
须同时付出这两种费用。对于每种费用都有一个可付出的最大值(背包容量)。问怎样
选择物品可以得到最大的价值。

故:对于01背包问题、完全背包问题和多重背包问题的方法都完全可以使用,只不过增加一个代价

接下来,01背包问题为例进行解答:

题目描述:
有 N 件物品和一个容量是 V 的背包,背包能承受的最大重量是 M。每件物品只能用一次。体积是 v[i],重量是 w[i],价值是 money[i]。
求解将哪些物品装入背包,可使物品总体积不超过背包容量,总重量不超过背包可承受的最大重量,且价值总和最大。输出最大价值。
输入格式 :
第一行3个整数,n,C, W,用空格隔开,分别表示物品件数、背包容积和背包可承受的最大重量。
接下来有 n 行,每行三个整数 v[i],w[i],money[i],用空格隔开,分别表示第 i 件物品的体积、重量和价值。
输出格式 :
输出一个整数,表示最大价值。

#include<iostream>
#include<algorithm> 
using namespace std;
int C, n, W;
int w[35], v[35], money[35], f[205][205] = { 0 };//h,much,num,a
int main()
{
	cout << "请输入物品件数、背包容积和背包可承受的最大重量:" << endl;
	cin >> n>> C >> W;
	cout << "请分别输入第 i 件物品的体积、重量和价值:" << endl;

	for (int i = 1; i <= n; i++)
	{
		cin >> v[i] >> w[i] >> money[i];
	}
	for (int i = 1; i <= n; i++)
	{
		//01背包问题
		for (int j = C; j >= v[i]; j--)
		{
		//注意逆序
			for (int k = W; k>=w[i];k--)
			{
				{
					f[j][k] = max(f[j][k], f[j - v[i]][k-w[i]] + money[i]);
				}
			}
		}
	
	}
	cout << "最大价值为:" << f[C][W] << endl;
	system("pause");
}

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!