hdoj1059

来源:互联网 发布:百度 seo 编辑:程序博客网 时间:2024/06/07 02:21

这是个01背包的稍微变型问题,因为刚开始做着道题的时候只是对背包了解了一点,导致老是拿着求最大解的思路来求解这道题,当然是不会过的!后来又看了分析,看了同学的代码才逐渐了解!hdoj2602是01背包,hdoj1114为完全背包,hdoj2191为多重背包,这些都是很规范的背包问题的。而hdoj1059是对可以取得解的考察,所以只需判断是否可以得到最优解就可以了,当然思路很重要!

#include<stdio.h> 

#include<string.h>
int main()
{
    int i,j,sum,k,t,m=0,a[7],b[10001],c[100010],ans;
    while(1)
    {m++;
       for(i=1;i<=6;i++)
         scanf("%d",&a[i]);
       if((a[1]==0)&&(a[2]==0)&&(a[3]==0)&&(a[4]==0)&&(a[5]==0)&&(a[6]==0))
           break;
       k=0;
       for(i=1;i<=6;i++)
       {  t=1;
          if(a[i]!=0)
          {
             while(t<a[i])
             {
                b[k++]=i*t;
                a[i]=a[i]-t;
                t=t*2;
             }
             b[k++]=i*a[i];
          }
       }
      
       sum=0;t=0;
       for(i=0;i<k;i++)
       sum=sum+b[i];
       if(sum%2!=0)
        t=1;
       else
       {  
           t=1;
           sum=sum/2;   memset(c,0,sizeof(0));
           for(i=0;i<k;i++)
           { 
              ans=0;
              for(j=0;j<i;j++)
              {
                 if((c[j]>ans)&&(c[j]+b[i]<=sum))
                  ans=c[j];
              }
              c[i]=b[i]+ans; 
              if(c[i]==sum)
              {
                 t=0;
                 break;
              }
           }
       }
       if(t==1)
        printf("Collection #%d:\nCan't be divided.\n\n",m);
       else
        printf("Collection #%d:\nCan be divided.\n\n",m);
    }
    return 0;
}
这个题我没有写出来状态转移方程,总体来说是对背包最优解的考察,每次都判断从规定的体积到每个循环的最小的体积能否被装满,然后再求出最优解,又是对别人的一个coppy啊!

原创粉丝点击