背包问题
一、01背包
问题描述:
•给定n种物品和一个背包, 物品i的重量是wi, 价值是vi, 背包容量为W
•对于每个物品,要么装背包,要么不装
•选择装背包的物品集合,使得物品总重量不超过背包容量W, 且价值和尽量大
•对于每个物品,要么装背包,要么不装
•选择装背包的物品集合,使得物品总重量不超过背包容量W, 且价值和尽量大
限制条件: 1<=n<=100 1<=wi,vi<=100 1<=W<=10000
输入:
4 5
2 3
1 2
3 4
2 2
输出:
7
4 5
2 3
1 2
3 4
2 2
输出:
7
i表示物品编号
j表示剩余背包容量
j表示剩余背包容量
1.首先给出最朴素的方法,针对每个物品是否放入背包进行搜索
时间复杂度:O(2^n)
时间复杂度:O(2^n)
#include<iostream>
#define M 100
using namespace std;
int n, W;
int w[M], v[M];
//从第i个物品开始挑选总重小于j的部分
int ret(int i, int j)
{
int res;
if(i == n)//已经没有剩余的物品
res = 0;
else if(j < w[i])//当前物品无法放入
res = ret(i+1, j);
else//当前物品放入和不放,取二者最大值
res = max(ret(i+1,j), ret(i+1, j-w[i])+v[i]);
return res;
}
int main()
{
cin>>n>>W;
for(int i = 0; i < n; i++)
{
cin>>w[i]>>v[i];
}
cout<<ret(0, W)<<endl;
return 0;
}