HDOJ 1059 POJ 1014 Dividing 【多重背包】

50 篇文章 0 订阅

有ai个重量为i的物品,i=1,2,3,4,5,6


问是否存在某种分配方案,把他们平均分?



其实这个题可以直接用多重背包搞:但是!对于每个题要仔细分析特点

举个例子,10000 10000 10000 10000 10000 10000这组数据

这么大的值有意义吗?其实并没有对吧。因为太大的值,我们可以提前平均分好

其实10000是等价于可以平均分的


但是,是偶数不能直接变成0。为什么?

再举个例子:1 2 1 0 0 0

看到这组数据其实是可以平均分的,因为1+3==2+2

但是,如果把2删掉,剩下的1和3是不能平均分的,会导致wa


所以呢,我们把很大的值变小,而且不改变奇偶性:改成5和6即可

那么这么小的数据,直接01背包,多背几次就好


代码如下:

//#include<bits/stdc++.h>
//using namespace std;
#include<iostream>
#include<cstdio>
#include<stdio.h>
#include<cstdlib>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<cstring>
using namespace std;

const int maxn=1000;
int a[10],sum;
int dp[maxn];

int main(){
    int Case=0;
    while(1){
        sum=0;
        if (Case) puts("");
        Case++;
        for(int i=1;i<=6;i++){
            scanf("%d",&a[i]);
            if (a[i]%2)
                a[i]=min(a[i],5);
            else
                a[i]=min(a[i],6);
            sum=sum+a[i]*i;
        }
        if (sum==0) break;
        if (sum%2){
            printf("Collection #%d:\nCan't be divided.\n",Case);
            continue;
        }
        memset(dp,0,sizeof(dp));
        dp[0]=1;
        for(int i=1;i<=6;i++)
            for(int j=1;j<=a[i];j++)
                for(int k=sum;k>=i;k--)
                    if (dp[k-i])
                        dp[k]=1;
        if (dp[sum/2])
            printf("Collection #%d:\nCan be divided.\n",Case);
        else
            printf("Collection #%d:\nCan't be divided.\n",Case);
    }
    return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值