フルーツ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
Sample Output
Author
呉迎
Statistic | Submit | Back
簡単な完全なリュックサックの問題です
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;
}