hduoj_1059(多重背包)

#include <stdio.h>
#include <string.h>

int dp[60001];
int v[20000];
int num[7];

int main()
{
	int i, j;
	int sum;
	int p, q;
	int c;
	c = 1;
	while (1)
	{
		sum = 0;
		for (i = 1; i <= 6; i++)
		{
			scanf("%d", &num[i]);
			sum += num[i] * i;
		}
			
		if (sum & 1)
		{
			printf("Collection #%d:\n", c);
			printf("Can't be divided.\n\n");
			c++;
			continue;
		}

		if (!num[1] && !num[2] && !num[3] && !num[4] && !num[5] && !num[6])
			return 0;

		p = 1;
		for (i = 1; i <= 6; i++)
		{
			q = 1;
			while (q < num[i])
			{
				v[p++] = i * q;
				num[i] -= q;
				q *= 2;
			}
			if (num[i])
				v[p++] = num[i] * i;
		}

		memset(dp, 0, sizeof(dp));
		
		for (i = 1; i < p; i++)
		{
			for (j = sum / 2; j >= v[i]; j--)
				dp[j] = dp[j] > (dp[j - v[i]] + v[i]) ? dp[j] : (dp[j - v[i]] + v[i]);
		}

		printf("Collection #%d:\n", c);
		if (dp[sum / 2] == sum / 2)
			printf("Can be divided.\n");
		else
			printf("Can't be divided.\n");

		printf("\n");

		c++;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_32862515/article/details/80950133
今日推荐