poj1014 hdu1059 Dividing 多重背包

有价值为1~6的宝物各num[i]个,求能否分成价值相等的两部分。

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
#define ll long long
#define mod 1000000007
using namespace std;

int dp[120010],num[10],v;

void pack01(int c,int w)
{
    for(int i=v;i>=c;i--)
        dp[i]=max(dp[i],dp[i-c]+w);
}

void packall(int c,int w)
{
    for(int i=c;i<=v;i++)
        dp[i]=max(dp[i],dp[i-c]+w);
}

void mulpack(int c,int w,int n)
{
    if(c*n>=v)
        packall(c,w);
    else
    {
        int i=1;
        while(i<n)
        {
            pack01(c*i,w*i);
            n-=i;
            i+=i;
        }
        pack01(c*n,w*n);
    }
}

int main()
{
    int cas=1,i,j,sum;//在这里多定义了一个v 导致一直出不来例子
    while(1)
    {
        sum=0;
        for(i=1;i<=6;i++)
        {
            scanf("%d",&num[i]);
            sum+=(num[i]*i);//WA
        }
        if(sum==0) break;
        printf("Collection #%d:\n",cas++);
        if(sum&1)
        {
            printf("Can‘t be divided.\n\n");
            continue;
        }

        memset(dp,0,sizeof dp);
        v=sum/2;
        for(i=1;i<=6;i++)
            if(num[i]) mulpack(i,i,num[i]);
        if(dp[v]==v) printf("Can be divided.\n\n");
        else printf("Can‘t be divided.\n\n");
    }
    return 0;
}
时间: 2024-10-12 03:25:23

poj1014 hdu1059 Dividing 多重背包的相关文章

poj1014+hdu1059--A - Dividing(多重背包,二进制优化)

A - Dividing Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description Marsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal share of

【POJ1014】Dividing 多重背包,二进制物品拆分转01背包

直接做01背包,即把物品数量累加,做20000物品的01背包指定TLE,不用我说了吧! 本文的优化是二进制优化,O(logn),至于完全背包记录已使用个数的O(n)算法本文不进行讲解,在博客的"背包"分类里. 二进制优化: 大家知道一个十进制数可以转换成二进制,那么假设某种物品有1023种,即2^10-1,二进制为111111111,则可以视为每一位分别是一个由{1,2,4,8,16,32,64,128,256,512}个物品糅合成的大物品,二进制数每一位0表示不取,1表示取,这样我们

HDU 1059 Dividing(多重背包)

HDU 1059 Dividing(多重背包) http://acm.hdu.edu.cn/showproblem.php?pid=1059 题意: 现在有价值为1,2,3,4,5,6的6种物品, 它们的数量为num[i]( 1<=i<=6 )个. 现在要问的是能否把所有的的物品分成两份且这两份物品的价值总和相同 ? 分析: 首先我们求出所有物品的价值和sum_val, 如果sum_val是奇数, 那么明显不能分. 那么sum_val为偶时, 我们令m=sum_val/2. 我能只要看看从所有

POJ 1014 Dividing (多重背包)

Dividing Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 58921   Accepted: 15200 Description Marsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal share of the marbl

hdu1059 dp(多重背包二进制优化)

hdu1059 题意,现在有价值为1.2.3.4.5.6的石头若干块,块数已知,问能否将这些石头分成两堆,且两堆价值相等. 很显然,愚蠢的我一开始并想不到什么多重背包二进制优化```因为我连听都没有听过```不得不吐槽自己的知识面太窄```于是,我用了母函数写这题,母函数的做法并没有问题,但是由于这道题的数据很大,母函数轻轻松松就超时了,于是,我又很努力地在母函数循环的优化上面想出路,改改改,各种改之后依旧TLE,01背包的做法显然也是会超时的,DISCUSS里的母函数做法优化方式都是模上一个大

hdu 1059 Dividing(多重背包优化)

Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 20635    Accepted Submission(s): 5813 Problem Description Marsha and Bill own a collection of marbles. They want to split the collection

hdu(1059) Dividing(多重背包)

题意:输入六个数,价值分别为1——6,输入的数代表该价值的物品的个数:求能否平均分. key:如果奇数肯定不能分,直接输出答案.偶数的话,就是多重背包问题. 试过两种做法,第一种是背包九讲的二进制优化,写三个函数,分别是bag01, bagall, bagmulti~第二种是直接多重背包,但很可能tle,这题我交的就是tle了~ #include <iostream> #include <algorithm> #include <string.h> #include &

台州 OJ 1315 Dividing 多重背包

题目的大概意思就是,有 6 种石头,价值分别是 1,2,3,4,5,6,给出他们的数量,求是否能将他们平分成两组价值相同的石头. 设石头的总价值为sum.把石头的价值看成重量,则问题转换成是否能恰好装下指定重量的石头,及背包容量为 sum/2 时,是否存在恰好装下一些石头的情况. 代码: #include <iostream> #include <cstring> using namespace std; const int MAX = 120005; int dp[MAX]; i

hdu1059 Dividing(完全背包)

Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20080    Accepted Submission(s): 5631 Problem Description Marsha and Bill own a collection of marbles. They want to split the collection