0 1 背包 回溯版

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>


using namespace std; 


#define MAX 1000


struct node
{
	int w, v;   //背包的价值和体积 
	int leap; 
}; 
int c, n;  //背包容量和物品个数 
int bestw, cw, cv;
int w, v; 
node data[MAX]; 


int compare( node a, node b )
{
	if( (1.0*a.w/a.v - 1.0*b.w/b.v) <=0 )
	return 0;
	return 1; 
}
 
float best_value(int i)
{
	int cp_c =  c - cv;
	int j = i;                   //是否是i+1 我觉得还是 i+1 老师是否写错了呢 
	float sum = 0.0; 
	while( j < n && data[j].v <=cp_c )
	{
		cp_c -= data[j].v;
		sum += data[j].w;
		j ++; 
	}  
	if(j < n && data[j].v > cp_c) 
	{
		sum += 1.0*cp_c*data[j].w/data[j].v; 
	} 
	return sum; 
}
 
void dfs(int i)
{
	if( i >= n )
	{
		if( cw > bestw ) 
		bestw = cw;
		for(int i=0; i<n; i++)
		if(data[i].leap) printf("%d %d ",data[i].w, data[i].v );
		putchar(10); 
		return; 
	} 
	else if( cv + data[i].v <= c )
	{
		cv += data[i].v;
		cw += data[i].w;
		data[i].leap = 1;   //选取这个物品 
		dfs(i+1); 
		cv -= data[i].v;
		cw -= data[i].w;
		data[i].leap = 0; 
	} 
	else if(best_value(i) >= bestw)  //不选这个物品 
	dfs(i+1); 
} 


int main()
{
int ncase;
scanf("%d",&ncase); 
while(ncase--)
{
	bestw = cw = 0; 
	scanf("%d %d",&c, &n);
	for(int i=0; i<n; i++)
	{
		scanf("%d %d", &data[i].w, &data[i].v);
		data[i].leap = 0; 
	} 
	sort(data, data+n, compare); 
	dfs(0);
	printf("%d\n",bestw); 
} 
system("pause");
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值