フルーツDP(2015年JXNU_ACSアルゴリズム組夏休み初週試合)


果物を分ける
Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 16   Accepted Submission(s) : 7
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
n個の果物を与えて、それぞれの果物はすべて1つの重量があって、2つの山に分けて、どのように分けて得点の得た重量の差値を最小にしますか?
Input
複数組のデータが入力され、データはすべて整数であり、各組のデータの最初の行には果物の個数n(1<=n<=10^3)が入力され、次の行にはn個の重量wi(0<=wi<=10^2)が入力される.
Output
各グループの入力に対して1行出力し、得られる最小差値を出力します.
Sample Input
5
10 20 30 10 10 

Sample Output
0

Author
呉迎
Statistic |  Submit |  Back
簡単な完全なリュックサックの問題です
#include <stdio.h>
#include <math.h>
#include <string.h>
int main()
{
	int n,dp[100005],a[1005],sum;
	while(scanf("%d",&n)!=EOF)
	{
		memset(dp,-100,sizeof(dp));//        
		memset(a,0,sizeof(a));
		dp[0]=sum=0;//dp[0]=0;
		for(int i=0;i<n;i++)
		scanf("%d",&a[i]),sum+=a[i];
		int max=-1;
		for(int i=0;i<n;i++)
		for(int j=sum/2;j>=a[i];j--)//     
		{
			dp[j]=dp[j-a[i]]+a[i];
			if(dp[j]>max)
			max=dp[j];
		}
		int cha=sum-2*max;
		if(cha<0)
		printf("%d
",-cha); else printf("%d
",cha); } return 0; }