分支回溯法-------7-1 0-1背包 (20 分)

一、给定n(n<=100)种物品和一个背包。物品i的重量是wi,价值为vi,背包的容量为C(C<=1000)。问:应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两个选择:装入或不装入。不能将物品i装入多次,也不能只装入部分物品i。

输入格式:
共有n+1行输入: 第一行为n值和c值,表示n件物品和背包容量c; 接下来的n行,每行有两个数据,分别表示第i(1≤i≤n)件物品的重量和价值。

输出格式:
输出装入背包中物品的最大总价值。

输入样例:

5 10

2 6

2 3

6 5

5 4

4 6

输出样例:

15

二、代码

#include<iostream>
#include<queue>
using namespace std;
int n,c;
int bestV=0; // 最优价值 
// 结点结构体
struct Node{
	int cw;
	int cv;
	int level; // 当前的层次i,即对于物品i
	int x[100];
}node;

// 物品结构体
struct Obj{
	int w;
	int v;
}obj[100];

// 分支限界函数 
void solve(){
	// 初始化结点
	node.cv = 0;
	node.cw = 0;
	node.level = 1; 
	queue<Node> q;
	q.push(node); // 加入队列中 
	
	while(!q.empty()){// 队列不为空时 
	
		Node node=q.front(); // 取对头内容
		q.pop(); // 去对头内容 
		
		//到达最后一层,即最后一个物品 
		if(node.level > n){
			if(bestV < node.cv) 
				bestV = node.cv;
		}
		
		else{
			if(node.cw + obj[node.level].w <= c){ // 约束条件:当前重量 + 选的物品重量是否小于 给定容量 
				
				Node left; // 生成左结点 
				left.cv = node.cv + obj[node.level].v;  
				left.cw = node.cw + obj[node.level].w;
				left.level = node.level + 1;
				q.push(left); // 加入队列 
			}
			
			Node right; // 生成右结点 
			right.cv = node.cv;
			right.cw = node.cw;
			right.level = node.level + 1;
			q.push(right);
		}
	}
	
}
int main(){
	
	cin>>n>>c;
	for(int i = 1;i <= n;i ++)
		cin>>obj[i].w>>obj[i].v;
		
	solve();
	cout<<bestV<<endl; // 输出最优值 
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值