一、背包九讲总述
关于动态规划问题,最典型的就是背包九讲,先理解背包九讲后再总结关于动态规划的问题
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");
}
来源:CSDN
作者:永不为辅
链接:https://blog.csdn.net/weixin_42579072/article/details/103245912