51nod 1007 正整数分组(01背包)

来源:互联网 发布:js中的if else 编辑:程序博客网 时间:2024/06/05 17:19

题目分类是动态规划,初看题目我只想到了搜索。怕超时,没写。看了下讨论版,才知道是01背包。
摘自讨论版:TIPS: 和最大为10000,两组最小的差值应该逼进sum / 2,所以当确定了sum/2 即可对N[i] < sum / 2的进行dp。之后再计算差值即可

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN=10010;int num[110];int dp[10010];int n,sum;int main(){    sum = 0;    int s = 0;    scanf("%d",&n);    for(int i = 0; i < n; ++i)    {        scanf("%d",&num[i]);        s += num[i];    }    sum = s/2;    for(int i = 0; i < n; ++i)    {        for(int j = sum; j >= num[i]; --j)            dp[j] = max(dp[j],dp[j-num[i]]+num[i]);    }    printf("%d\n",abs(s-dp[sum]-dp[sum]));    return 0;}
0 0