设为首页 加入收藏

TOP

poj 1004 Dividing
2015-07-20 17:57:07 来源: 作者: 【 】 浏览:4
Tags:poj 1004 Dividing

题目大意是,从输入六个数 ,第i个数代表价值为i的有几个,平均分给两个人 ,明摆着的背包问题,本来以为把他转化为01背包,但是TLe,后来发现是12万的平方还多,所以妥妥的TLE,后来发现这是一个完全背包问题,然后即纠结了 ,没学过啊 ,最后发现思想好i是蛮简单的,水水的A掉了,最后注意一下初始化问题和输入问题后就好了

#include 
  
   
#include 
   
     int a[10]; int dp[120005]; int maxx(int a,int b) { return (a>b)?a:b; } int main() { int cases=0; while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6])!=EOF) { memset(dp,0,sizeof(dp)); int sum=0; if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0&&a[6]==0) break; for(int i=1;i<7;i++) { sum+=a[i]*i; } int mount; int i,j,k; // printf(" %d\n",sum); if(sum%2)//当时奇数的时候肯定不能分开 { printf("Collection #%d:\nCan't be divided.\n\n",++cases); } else { for(i=1;i<=6;i++) { // printf("%d %d ",sum,a[i]); mount=a[i]; // printf("%d\n",mount); dp[0]=1;//初始化为1。如果不初始化的话,因为dp【1】+=dp【0】; for(k=1;k<=mount;k*=2) { for(j=sum/2;j>=k*i;j--) dp[j]+=dp[j-k*i]; mount-=k; } if(mount) for(j=sum/2;j>=mount*i;j--) //从sum/2开始 最后能不能有,有就一定是sum/2; dp[j]+=dp[j-mount*i]; } //for(int i=0;i
    
     

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇c++ 中const的使用 下一篇BestCoder Round #4 Miaomiao'..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: