Knapsack 问题(可重复选择)

1. 使用递推公式:

v[i][j] = max{ v[i-1][j- k *weight[i] ] + k * value[i] | k >= 0, k * weight[i] <= j}

数据输入如下:

1   -------> 测试用例的个数
3     ---------->  数据的个数
2 3 4 ----------> weight
60 75 90  ----> value
5         ------> 最大的 weight (capacity)
代码如下:
#include 

#define MAX_WEIGHT		15000
#define MAX_COUNT		1001

#define TOTAL_WEIGHT	MAX_COUNT * MAX_WEIGHT

int g_weight[MAX_COUNT];
int g_value[MAX_COUNT];
int g_max_value[MAX_COUNT][ MAX_WEIGHT];
int g_count;
int g_capacity;

int get_max_value(void)
{
	int i;
	for(i = 0; i <= g_capacity; i++)
	{
		g_max_value[0][i] = 0;
	}

	int j;
	for(i = 1; i <= g_count; i++)
	{
		for(j = 0; j <= g_capacity; j++)
		{
			int max = 0;

			int k = 0;
			while(k * g_weight[i] <= j)
			{
				if( g_max_value[i-1] [j-k * g_weight[i]] + k * g_value[i] > max)
				{
					max = g_max_value[i-1][j-k*g_weight[i]] + k * g_value[i];
				}
				k++;
			}
			g_max_value[i][j] = max;
			printf("(%d, %d) max: %d\n", i, j, max);
		}

	}
}


void read_data(void)
{
	scanf("%d", &g_count);

	int i;
	for(i = 1; i <= g_count; i++)
	{
		scanf("%d", &g_weight[i]);
	}

	for(i = 1; i <= g_count; i++)
	{
		scanf("%d", &g_value[i]);
	}

	scanf("%d", &g_capacity);
}


int main(void)
{
	int T;
	scanf("%d", &T);

	int i;
	for(i = 0; i < T; i++)
	{
		printf("Case #%d\n", i+1);
		read_data();
		get_max_value();
		printf("%d\n", g_max_value[g_count][g_capacity]);
	}

	return 0;
}

2. 使用递推公式:

v[i] = max{valuet[k] + v[i - weight[k] | k 属于数据集合的元素}

代码实现:

#include 

#define MAX_WEIGHT		15000
#define MAX_COUNT		1001

#define TOTAL_WEIGHT	MAX_COUNT * MAX_WEIGHT

int g_weight[MAX_COUNT];
int g_value[MAX_COUNT];
//int g_max_value[MAX_COUNT][ MAX_WEIGHT];
int g_count;
int g_capacity;

int g_max_value[MAX_COUNT];

int get_max_value(void)
{
	int i;
	int max = 0;
	g_max_value[0] = 0;
	for(i = 1; i <= g_capacity; i++)
	{
		int j;
		for(j = 1; j <= g_count; j++)
		{
			if(g_weight[j] <= i)
			{
				if(max < g_value[j] + g_max_value[i - g_weight[j]])
				{
					max = g_value[j] + g_max_value[i-g_weight[j]];
				}
			}
		}
		
		g_max_value[i] = max;
	}
}


void read_data(void)
{
	scanf("%d", &g_count);

	int i;
	for(i = 1; i <= g_count; i++)
	{
		scanf("%d", &g_weight[i]);
	}

	for(i = 1; i <= g_count; i++)
	{
		scanf("%d", &g_value[i]);
	}

	scanf("%d", &g_capacity);
}


int main(void)
{
	int T;
	scanf("%d", &T);

	int i;
	for(i = 0; i < T; i++)
	{
		printf("Case #%d\n", i+1);
		read_data();
		get_max_value();
		printf("%d\n", g_max_value[g_capacity]);
	}

	return 0;
}

References:

1. http://www.cnblogs.com/jack204/archive/2011/10/15/2212745.html

2. http://blog.csdn.net/zhangxb35/article/details/38963449

你可能感兴趣的:(Algorithms)