超市买东西-01背包

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;
}```

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码码搬运工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值