六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 36|回复: 0

poj1014——Dividing

[复制链接]

升级  93.8%

309

主题

309

主题

309

主题

进士

Rank: 4

积分
969
 楼主| 发表于 2013-1-26 13:37:40 | 显示全部楼层 |阅读模式
多重背包问题。        
转化为01背包问题。不过 需优化,否则会TLE。
优化部分程序中标出。
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int f[60005];int a[7];int cnt;int b[60005],c[60005];int main(){int i,sum,ca=0;int v;while(1){sum=0;for(i=1;i<=6;i++){cin>>a[i];sum+=a[i];}if(sum==0) break;printf("Collection #%d:\n",++ca);sum=0;for(i=1;i<=6;i++)sum+=i*a[i];if(sum%2!=0) {printf("Can't be divided.\n");}else {cnt=0;for(i=1;i<=6;i++)//优化部分{int k=1;while(a[i]-k+1>0){b[++cnt]=i*k;c[cnt]=i*k;a[i]-=k;k=2*k;}if(a[i]>0){b[++cnt]=i*a[i];c[cnt]=i*a[i];}}v=sum/2;memset(f,-1,sizeof(f));f[0]=0;int j;for(i=1;i<=cnt;i++)for(j=v;j>=0;j--){if(j-b[i]>=0){f[j]=f[j-b[i]]+c[i]>f[j]?f[j-b[i]]+c[i]:f[j];}else f[j]=f[j];} if(f[v]==v) printf("Can be divided.\n"); else printf("Can't be divided.\n");}printf("\n");}return 0;}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表