小H的超大背包
题目描述
小H有一个容量特别大的背包,用来装一些体积很大的物品.
每个物品都有一个价值,并且只有一件
请你帮助小H计算这个超大背包最大能装多少价值的物品,并且这些物品的总体积不超过背包容量
输入
第一行两个整数N,V(1<=N<=8,1<=V<=2000000000),表示物品的数量和背包的容量
接下来N行:
每行有两个整数v,w(1<=v<=1000000000,1<=w<=1000000),表示每件物品的体积和价值
输出
输出最大价值
输入样例:
4 5
1 2
2 4
3 4
4 5
输出样例:
8
题目分析:
这题的n比较小,可以使用回溯算法,递归出口就是背包放不下了。话不多说,直接上代码
解决方案:
#include <iostream>
using namespace std;
long V;
int N;
long item[8][2]; //存储体积和价值
int take[8]={0};
long seek(int start,long v){
if(item[start][0]+v>V) //放不下了
return 0;
take[start]=1;
long t=0;
for(int i=0;i<N;i++){
if(!take[i])
t=max(seek(i,item[start][0]+v),t);
}
take[start]=0;
return t+item[start][1];
}
long maximun(){
long t=0;
for(int i=0;i<N;i++) //第一个放入背包的物品
t=max(seek(i,0),t);
return t;
}
int main(){
cin>>N>>V;
for(int i=0;i<N;i++)
cin>>item[i][0]>>item[i][1];
cout<<maximun();
return 0;
}