hdu 1059 多重揹包

2021-09-06 08:33:27 字數 1352 閱讀 4433

題目的意思:

有一堆大理石,按其大小分為1-6

種價值,兩個人想分得的價值相同的大理石,已知每種價值的大理石個數,問是否能讓兩個人分得價值相同的大理石?

題目輸入:

1 0 1 2 0 0

1 0 0 0 1 1

0 0 0 0 0 0

題目輸出:

collection #1:

can't be divided.

collection #2:

can be divided.

解題思路:

很明顯這是乙個多重揹包問題,可以將問題轉化為0/1

揹包問題解決。將每種價值

v的大理石數

x,按二進位制分解成價值為

1*v,2*v,4*v…,2^k-1*v,(x-2^k+1)*v的大理石,其它價值的大理石也這樣分解,這樣就轉化成為

0/1揹包問題了(由於

1,2,4…,2^k-1,x-2^k+1

可以組成

0~x中的任意數值)。後面的問題就簡單了,只要能找到一種取分解後大理石的取法,使取得後的大理石的總價值等於全部大理石總價值的一半就說明可以平均分配,否則就不能。

**:

#include #include 

int ans[120001

];int

half;

int data[7

];int tpe[20];

int main(void

)half /= 2

; memset(ans,

0, (half + 1) * sizeof(int

));

for (i = 0; i <= data[1]; i ++)

ans[i] = 1

; cur_max = data[1

];

for (i = 2; i < 7; i ++)

for (j = cur_max; j > data[1] && j - (data[i] - tpe[k] + 1) * i >= 0; j --)

if (!ans[j])//

特別注意要判斷是否為1,開始調了好久,就因為這個沒判斷啊!

ans[j] = ans[j - (data[i] - tpe[k] + 1) *i];

}

if(ans[half])

fprintf(stdout,

"can be divided.\n\n");

else

fprintf(stdout,

"can't be divided.\n\n

");

}

HDU 1059 多重揹包

個人覺得,這個可以作為多重揹包的模板使用,其中包括了簡單的0 1揹包和完全揹包,分清楚它們三個的區別。include include define n 60005 define max a,b a b?a b int c n void complete int cost,int weight,int...

hdu1059 多重揹包

這道剛開始都沒想出來。後來發現我以前做了一道和這個完全一樣的題,就是計蒜客的平分娃娃,好菜呀 t t 說的可能有些繁瑣。大佬可以忽略,直接看 一道經典的多重揹包問題,但是會卡時間,用二進位制優化一下就解決了。這裡重點講思路,題目問的如何將一堆彈珠均等對半分,可以先這樣想,乙個彈珠價值6,它的體積也是...

hdu 1059 多重揹包

題意 價值分別為1,2,3,4,5,6的物品個數分別為a 1 a 2 a 3 a 4 a 5 a 6 問能不能分成兩堆價值相等的。解法 轉化成多重揹包 1 include2 include 3 include4 include5 using namespace std 67 int dp 12001...