背包问题(Knapsack problem) 之二

接着上一篇的背包问题。

上一篇的实现利用了递归的思想,但是实现没有使用函数递归。

下面我们使用函数递归的方法来实现背包问题。

代码如下:

#include <stdio.h>

#define MAX_WEIGHT		20
#define MAX_COUNT	10		

struct  item
{
	int weight;
	int value;
	int index;
};

struct item  item_array[MAX_COUNT];

struct solution
{
	unsigned int bits;
	int value;
};

void make_solution(int weight, int index, struct solution *s)
{
	struct solution v1, v2;
	if(index < 0)
	{
		s->bits = s->value = 0;
		return;
	}
	
	if(weight < item_array[index].weight)
	{
		make_solution(weight, index -1, s);
		return;
	}

	make_solution(weight, index - 1, &v1);
	make_solution(weight - item_array[index].weight, index - 1, &v2);

	v2.value += item_array[index].value;
	v2.bits |= (1 << index);

	*s = (v1.value >= v2.value) ? v1 : v2;
}



int main(void)
{
	FILE *fp = freopen("input.txt", "r", stdin);

	if(fp == NULL)
	{
		printf("open file failed\n");
		return -1;
	}

	int count = 0, total_weight = 0;

	scanf("%d %d", &count, &total_weight);

	int i;
	for(i = 0; i < count; i++)
	{
		scanf("%d", &item_array[i].weight);
		item_array[i].index = i + 1;
	}

	for(i = 0; i < count; i++)
	{
		scanf("%d", &item_array[i].value);
	}

	struct solution s;
	make_solution(total_weight, count - 1, &s);

	for(i = 0; i < count; i++)
	{
		if( s.bits & (1 << i))
		{
			printf("%d ", item_array[i].index);
		}
	}
	printf("\n");

	fclose(fp);
	return 0;
}

$ cat input.txt 
5 10
2 2 6 5 4
6 3 5 4 6
输出如下:

./a.out 
1 2 5 


参考:

1. http://rosettacode.org/wiki/Knapsack_problem/0-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值