nyoj-325-zb的生日

需要优化的01背包:

复制代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
int  dp[100005];
int main()
{
 int n,i,j,v,tv,w[30];
 while(~scanf("%d",&n))
 {
     for(i=0,v=0;i<n;++i)
    {
        scanf("%d",&w[i]);
        v+=w[i];
     }
     tv=v/2; //思路:最大差值--》一半总重量为容量的背包最多能装多少重量的西瓜
    for(i=0;i<=tv;++i)
        dp[i]=0;
     for(i=0;i<n;++i)
         for(j=tv;j>=w[i];--j)
         {
             /*
              赋值要耗费的时间比+,-,*,/更大,条件表达式是最缩减时间的
              改用max会更悲剧,反正最后的结果都是TLE
             */
                dp[j]=dp[j]>dp[j-w[i]]+w[i]?dp[j]:dp[j-w[i]]+w[i];
         }
      printf("%d\n",abs(v-dp[tv]*2));
 }
        return 0;
}
posted @ 2013-07-16 08:27  nylg-haozi  阅读(153)  评论(0编辑  收藏  举报