#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了,数据量不算很大

浙公网安备 33010602011771号