HDU 1059 Dividing 多重背包

题目大意:

 就是给出每个数的个数,问这些数能不能分成2组,使得两组的和相等


大致思路:

这是一个简单的多重背包问题吧,判断一下和是偶数时的情况下f [ sum / 2 ]是否是true即可

很简单的一道背包题。

代码如下:

Result  :  Accepted     Memory  :  316 KB     Time  :  390 ms

/*
 * Author: Gatevin
 * Created Time:  2014/8/9 20:37:11
 * File Name: hehe.cpp
 */
#include<iostream>
#include<sstream>
#include<fstream>
#include<vector>
#include<list>
#include<deque>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<cmath>
#include<ctime>
#include<iomanip>
using namespace std;
const double eps(1e-8);
typedef long long lint;

int n;
int tmp;
bool f[60010];
int all;
int main()
{
    int t[7];
    int cas = 0;
    while(~scanf("%d", t + 1))
    {
        cas++;
        for(int i = 2; i <= 6; i++) scanf("%d", t + i);
        if(!t[1] &&!t[2] && !t[3] && !t[4] && !t[5] && !t[6]) return 0;
        memset(f, 0, sizeof(f));
        f[0] = true;
        all = 0;
        for(int i = 1; i <= 6; i++)
        {
            all += i*t[i];
        }
        if(all & 1)
        {
            printf("Collection #%d:\nCan't be divided.\n\n", cas);
            continue;
        }
        for(int i = 1; i <= 6; i++)
        {
            int k = 1;
            while(k < t[i])
            {
                for(int j = (all >> 1); j >= k*i; j--)
                {
                    f[j] = f[j] || f[j - k*i];
                }
                t[i] -= k;
                k *= 2;
            }
            for(int j = (all >> 1); j >= t[i]*i; j--)
            {
                f[j] = f[j] || f[j - t[i]*i];
            }
        }
        if(f[all >> 1])
        {
            printf("Collection #%d:\nCan be divided.\n\n", cas);
        }
        else
        {
            printf("Collection #%d:\nCan't be divided.\n\n",cas);
        }
    }
    
    return 0;
}

 

你可能感兴趣的:(HDU,1059,多重背包,Dividing)