01背包问题
题目描述
一个旅行者有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是 W1,W2,…,Wn ,它们的价值分别为 C1 , C2 ,…, Cn ,求旅行者能获得最大总价值。
输入描述
第一行:两个整数,M (背包容量,M≤200 )和 N (物品数量, N≤30 );
第 2…N+1 行:每行二个整数 Wi,Ci ,表示每个物品的重量和价值。
输出描述
仅一行,一个数,表示最大总价值。
样例
输入
10 4
2 1
3 3
4 5
7 9
输出
12
做题思路
这道题要用深度优先搜索来做。岔路口是这个物品是装在背包里还是不装,当所有物品都决定好的时候,要判断背包里的物品是否不超重且价值最高,最后求出最大总价值。
代码
#include<iostream>
using namespace std;
int b[205],n,a[205],x,maxx=-1;//定义
void fun(int y,int cnt,int sum){//查找函数
if(y>n){//判断所有物品是否都选择完了
if(cnt<=x&&sum>maxx){//判断是否不超重且价值最高
maxx=sum;
}
return;
}
fun(y+1,cnt,sum);//不选这个物品
fun(y+1,cnt+a[y],sum+b[y]);//选这个物品
}
int main(){
cin>>x>>n;//输入
for(int i=1;i<=n;i++){
cin>>a[i];
cin>>b[i];
}
fun(1,0,0);
cout<<maxx;//输出
return 0;
}