POJ 1014 Dividing 多重揹包

題意:有6種不同價值的石頭,告訴你每種石頭的數量。現在兩個人要平分這些石頭,希望每個人得到的價值相同的。問是否可以達到要求的方案。

思路:標準的多重揹包,因爲找到是否存在解,把數量二進制分解就行了。

代碼如下:

#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

const int MAX = 200010;

int a[MAX],dp[MAX];

int main(void)
{
    //freopen("input.txt","r",stdin);
    int cas = 1;
    while(1){
        int sum = 0;
        for(int i = 1; i <= 6; ++i){
            scanf("%d",&a[i]);
            sum += a[i] * i;
        }
        if(sum == 0) break;
        memset(dp,0,sizeof(dp));
        dp[0] = 1;
        for(int i = 1; i <= 6; ++i){
            int num = a[i];
            for(int k = 1; num > 0; k <<= 1){
                int mul = min(k,num);
                for(int j = sum; j >= i * mul; --j)
                    if(dp[j-i*mul]) dp[j] = 1;
                num -= mul;
            }
        }
        printf("Collection #%d:\n",cas++);
        if(sum&1 || dp[sum>>1] == 0)
            puts("Can't be divided.\n");
        else
            puts("Can be divided.\n");
    }
    return 0;
}

發佈了283 篇原創文章 · 獲贊 4 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章