XDOJ174.分配宝藏

标题    
分配宝藏

类别    
综合

时间限制    
2S

内存限制    
256Kb

问题描述    
两个寻宝者找到一个宝藏,里面包含n件物品,每件物品的价值分别是W[0],W[1],…W[n-1]。
SumA代表寻宝者A所获物品价值总和,SumB代表寻宝者B所获物品价值总和,请问怎么分配才能使得两人所获物品价值总和差距最小,即两人所获物品价值总和之差的绝对值|SumA - SumB|最小。

输入说明    
输入数据由两行构成:
第一行为一个正整数n,表示物品个数,其中0<n<=200。
第二行有n个正整数,分别代表每件物品的价值W[i],其中0<W[i]<=200。

输出说明    
对于每组数据,输出一个整数|SumA-SumB|,表示两人所获物品价值总和之差的最小值。

输入样例    
4
1 2 3 4

输出样例    
0
 

#include<math.h>
#include<stdio.h>

int dp[201][20001] = { 0 };
int v_w[201] = { 0 };
int sum = 0;
int item[201];
//
//void findWhat(int i, int j)
//{				//最优解情况
//	if (i >= 0) 
//	{
//		if (dp[i][j] == dp[i - 1][j]) 
//		{
//			item[i] = 0;
//			findWhat(i - 1, j);
//		}
//		else if (j - v_w[i] >= 0 && dp[i][j] == dp[i - 1][j - v_w[i]] + v_w[i]) 
//		{
//			item[i] = 1;
//			findWhat(i - 1, j - v_w[i]);
//		}
//	}
//}

int main()
{
	int n = 0;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		scanf("%d", &v_w[i]);
		sum += v_w[i];
	}
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= sum / 2; j++)
		{
			if (v_w[i] > j)
			{
				dp[i][j] = dp[i - 1][j];
			}
			else
			{
				dp[i][j] = dp[i - 1][j] > dp[i - 1][j - v_w[i]] + v_w[i] ? dp[i - 1][j] : dp[i - 1][j - v_w[i]] + v_w[i];
			}
		}
	}
	int ret = fabs(2 * dp[n][sum / 2] - sum);
	printf("%d\n", ret);
	//findWhat(n, sum / 2);
	//for (int i = 1; i <= n; i++)
	//{
	//	printf("%d ", item[i]);
	//}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值