poj 1004 Dividing

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

#include <stdio.h>
#include <string.h>
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<sum/2;i++)
// printf("%d\n",dp[i]);
if(dp[sum/2])
printf("Collection #%d:\nCan be divided.\n",++cases);
else
printf("Collection #%d:\nCan't be divided.\n",++cases);
printf("\n");
}
}
}

版权声明:都是兄弟,请重新发布。请说明谁是兄弟

上一篇:Ubuntu部署python3.7的开发和运行环境


下一篇:整理一下odoo10在windows系统下部署的流程