1005. Stone Pile
Time limit: 1.0 second
Memory limit: 64 MB
Memory limit: 64 MB
You have a number of stones with known weights
w
1, …,
wn. Write a program that will rearrange the stones into two piles such that weight difference between the piles is minimal.
Input
Input contains the number of stones
n (1 ≤
n ≤ 20) and weights of the stones
w
1, …,
wn (integers, 1 ≤
wi ≤ 100000) delimited by white spaces.
Output
Your program should output a number representing the minimal possible weight difference between stone piles.
Sample
input | output |
---|---|
5 5 8 13 27 14 | 3 |
Problem Source: USU Championship 1997
Tags:
problem for beginners
)
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
using namespace std;
int dp[1000005]; //数组必须开到100W以上
int main()
{
int n,i,j;
int a[25];
scanf("%d",&n);
memset(dp,0,sizeof(dp));
int ans=0;
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
ans+=a[i];
}
int sum=ans/2;
for(i=0; i<n; i++)
{
for(j=sum; j>=a[i]; j--)
{
dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
}
}
printf("%d\n",ans-dp[sum]*2);
return 0;
}