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");
        }
    }
}


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



本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4671787.html,如需转载请自行联系原作者


相关文章
|
9月前
|
容器
POJ 3640 Conformity
POJ 3640 Conformity
40 0
|
测试技术
poj-1218 THE DRUNK JAILER 喝醉的狱卒
自己去看看原题; 题目大意: 就是一个狱卒喝醉了,他第一趟吧所有的监狱都带开,第二趟把能把二整除的监狱关闭,第三趟操作能把三整除的监狱; 求最后能逃跑的罪犯数 输入第一个数是代表 测试数据组数 每个数据代表狱卒来回的次数 当作开关问题即可 #include using names...
960 0
poj-3094-quicksum
http://poj.org/problem?id=3094 很简单 #include #include using namespace std; int main() { string a; int sum=0; while(getline(cin...
552 0
POJ-1003-hangover
Description How far can you make a stack of cards overhang a table? If you have one card, you can create a maximum overhang of half a card length.
737 0
POJ 2027 No Brainer
Problem Description Zombies love to eat brains. Yum. Input The first line contains a single integer n indicating the number of data sets.
841 0
|
机器学习/深度学习 Windows
|
机器学习/深度学习