0/1背包问题:问题同背包问题4,只是约定物品不允许拆零。
算法设计5:递归枚举解0/1背包问题。
算法5的设计思想与背包问题3类似,为找出大规模与小规模问题的关系,对于每一件物品考虑仅有两种可能“选择或不选择”,当然选择某物品的前提是背包容量可以容纳它。
C++代码:
#include <iostream>
#include <vector>
using namespace std;
//此函数返回背包容量为m,当物品件数为n时的最大利润,v[i]表示第i+1件物品的重量,p[i]表示第i+1件物品的利润
int fun(vector<int> &v, vector<int> &p, int m, int n)
{
if (0 == n)
{
return 0;
}
//不放第i件物品
int max1 = fun(v, p, m, n-1);
int max2 = -1;
//如果放的下第n件物品
if (v[n-1] <= m)
{
max2 = fun(v, p, m-v[n-1], n-1) + p[n-1];
}
return max1 > max2? max1 : max2;
}
int main()
{
cout<<"请输入背包的总重量:";
//背包的总重量m
int m;
cin>>m;
cout<<"请分别输入所有物品的重量与利润:"<<endl;
vector<int> v, p;
int wt, pt;
//n为物品的总件数
int n = 0;
while( cin>>wt>>pt )
{
v.push_back(wt);
p.push_back(pt);
++n;
}
cout<<"最大利润"<<fun(v,p,m,n)<<endl;
return 0;
}
运行结果: