题目描述:
01背包问题
时间限制:1秒 内存限制:128M
题目描述
一个旅行者有一个最多能装 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
思路:
1、输入
2、dfs
3、输出最大值
dfs{
1、三个参数,下标,占背包容量、总价
2、结束条件(下标==数量+1)
3、两种情况 {
1、选{
1、如果加上小于或等于容量{
1、求解最大值
2、继续dfs;
}
}
2、不选{
1、dfs继续搜索下一个
}
}
}
我们可以画出一个二叉树
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int cnt=0,c[100005],w[100005];
int m,n;
void dfs(int t,int sumc,int sumv){
if(t==n+1) return;
dfs(t+1,sumc,sumv);
if(sumc+w[t]<=m){
cnt=max(cnt,sumv+c[t]);
dfs(t+1,sumc+w[t],sumv+c[t]);
}
}
signed main(){
cin>>m>>n;
for(int i=1; i<=n; i++){
cin>>w[i]>>c[i];
}
dfs(1,0,0);
cout<<cnt;
return 0;
}