void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <algorithm>
using namespace std;
int a[22];
int dp[2500000];
int main()
{
	int n;
	scanf("%d",&n);
	memset(dp,0,sizeof(dp));
	int sum = 0;
	for(int i=0; i<n; i++)
	{
		scanf("%d",&a[i]);
		sum += a[i];
	}
	for(int i=0; i<n; i++)
		for(int k=sum; k>=a[i]; k--)
			dp[k] = max( dp[k],dp[k-a[i]] + a[i]);
	int mmin = INT_MAX;
	for(int i=0; i<=sum; i++)
		if( dp[i] && abs(sum-dp[i]-dp[i]) < mmin )
			mmin = abs(sum-dp[i]-dp[i]);
	printf("%d\n",mmin);	
	
return 0;
}

给出一堆石头的重量,让你分成两堆,要求两堆重量的差最小

有人用模拟直接过了,这个题看了下discuss,想到用背包,因为背包可以把所有可能的情况状态都罗列出来

 

然后从0到sum一个一个遍历就ok了,数据量不算很大

 

 

posted on 2011-05-13 12:18  void-man  阅读(264)  评论(0)    收藏  举报