思路:判断这n个数能组成的数有哪些, 枚举差值,维护最小值。
看到sum的范围小于10000就得想到背包了。。。
#include <bits/stdc++.h>
using namespace std;
const int inf =0x3f3f3f3f;
typedef long long LL;
const int MAXN = 10005;
const int mod = 1e9+7;
int a[105];
int dp[MAXN];
int main()
{
int n;
while(~scanf("%d", &n))
{
int ans=inf, sum=0;
for(int i=1; i<=n; ++i)
{
scanf("%d", &a[i]);
sum+=a[i];
}
memset(dp, 0, sizeof(dp));
dp[0]=1;
for(int i=1;i<=n;++i)
for(int j=sum;j>=a[i];--j)
dp[j]=max(dp[j], dp[j-a[i]]);
for(int i=1;i<=sum/2;++i)
if(dp[i])
ans=min(ans, sum-i-i);
printf("%d\n", ans);
}
return 0;
}