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