01背包问题
01背包问题:
你来到超市,发现超市有活动,
给你一个容量为W的背包,
你可以免费拿三件物品,
要求这些物品可以放入背包而不超重,并且价值最大。
先输入2个整数N,W, (N表示物品的总数量,W见上),
接下来输入N行,每行2个整数,wi,vi,分别表示物品的重量和价值。
10 50
20 6
30 15
1 2
51 36
28 10
9 5
15 5
5 3
40 25
24 8
#include <bits/stdc++.h>
using namespace std;
int N; //表示物品总数
int W; //表示容量
struct goods{
int w; //表示物品重量
int v; //表示物品价值
};
goods g[100];
bool h[100];
int value = 0;
void dfs(int id,int k){ //k是选择的物品数量
if(id >= N || k >= 3 ){
if(k == 3){
int lw = 0;//临时的重量
int lv = 0;//临时的价值
for(int i = 0 ;i < N ;i++){ //遍历所有物品
if(h[i]){
lw += g[i].w;
lv += g[i].v;
}
}
if(lw <= W && lv > value){
value = lv;
}
}
return ;
} else {
h[id]=0; //未选择
dfs(id + 1,k);
h[id]=1; //选择
dfs(id + 1, k +1); //选中物品 k+1
h[id]=0;
}
}
int main(){
ios::sync_with_stdio(0);
cin>>N>>W;
for(int i = 0; i < N;i++) {
cin>>g[i].w>>g[i].v;
}
dfs(0,0);
cout<<value<<endl;
return 0;
}
/*
01背包问题:
你来到超市,发现超市有活动,
给你一个容量为W的背包,
你可以免费拿物品,
要求这些物品可以放入背包而不超重,并且价值最大。
先输入2个整数N,W, (N表示物品的总数量,W见上),
接下来输入N行,每行2个整数,wi,vi,分别表示物品的重量和价值。
10 50
20 6
30 15
1 2
51 36
28 10
9 5
15 5
5 3
40 25
24 8
*/
#include <bits/stdc++.h>
using namespace std;
int N; //表示物品总数
int W; //表示容量
struct goods{
int w; //表示物品重量
int v; //表示物品价值
};
goods g[100];
bool h[100];
int value = 0;
void dfs(int id){
if(id >= N){
int lw = 0;//临时的重量
int lv = 0;//临时的价值
for(int i = 0 ;i < N ;i++){ //遍历所有物品
if(h[i]){
lw += g[i].w;
lv += g[i].v;
}
}
if(lw <= W && lv > value){
value = lv;
}
return ;
} else {
h[id]=0; //未选择
dfs(id + 1);
h[id]=1; //选择
dfs(id + 1); //选中物品 k+1
h[id]=0;
}
}
int main(){
ios::sync_with_stdio(0);
cin>>N>>W;
for(int i = 0; i < N;i++) {
cin>>g[i].w>>g[i].v;
}
dfs(0);
cout<<value<<endl;
return 0;
}```