poj 1014 _ 多重背包

题目描述:

有1-6重量的物品。给出一个数列分别代表这些重量的物品的数量。求这些物品是否能被平分为两堆等重的物品。

 

解题思路:

把总重量的一半作为容量上限,把重量作为判定价格。定义F[v]为最接近v重量的物品能凑成的重量。

 

 

代码:

#include <stdio.h>
#include <stdlib.h>
#define V 60200

int f[V];

main()
{
   int set[7];
   int sum=0, i, k, v, count = 1, c, s;
  
   for(i=1;i<=6;i++)
   {
      scanf("%d",&set[i]);
      sum += set[i]*i;
   }
   while(sum!=0)
   {
      printf("Collection #%d:\n",count++);
      if(0 == sum%2)
      {
         memset(f,0,sizeof(int)*(sum/2+1));//int f[] = {0};
         for(i=1;i<=6;i++)
         {
            c = set[i];
            k = 1;
            while(c >= k)
            {
               for(v = sum/2;v>=k*i;v--)
                 if(f[v-k*i]+k*i <= v)
                    f[v] = f[v]>f[v-k*i]+k*i ? f[v]:f[v-k*i]+k*i;
               c -= k;
               k*=2;
            }
            if(0 != c)
            {
               k = c;
               for(v = sum/2;v>=k*i;v--)
                 if(f[v-k*i]+k*i <= v)
                    f[v] = f[v]>f[v-k*i]+k*i ? f[v]:f[v-k*i]+k*i;
            }
         }
        
         if(f[sum/2] == sum/2)
            printf("Can be divided.\n\n");
         else
            printf("Can't be divided.\n\n");
      }
      else
         printf("Can't be divided.\n\n");
     
      sum = 0;
      for(i=1;i<=6;i++)
      {
         scanf("%d",&set[i]);
         sum += set[i]*i;
      }
   }
   //system("pause");
   return 0;
  
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值