接着上一篇的背包问题。
上一篇的实现利用了递归的思想,但是实现没有使用函数递归。
下面我们使用函数递归的方法来实现背包问题。
代码如下:
#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
参考: