hdu1059 多重揹包

2021-09-21 14:28:19 字數 923 閱讀 3222

這道剛開始都沒想出來。。。

後來發現我以前做了一道和這個完全一樣的題,就是計蒜客的平分娃娃,好菜呀(t_t)

說的可能有些繁瑣。。。大佬可以忽略,直接看**

一道經典的多重揹包問題,但是會卡時間,用二進位制優化一下就解決了。

這裡重點講思路,題目問的如何將一堆彈珠均等對半分,可以先這樣想,乙個彈珠價值6,它的體積也是6,另乙個彈珠的價值是5,那體積就是5,乙個彈珠的價值就等於它的體積。

假設一堆彈珠的總價值是 x ,現在我們要找出一堆總價值為 x/2 的彈珠,那這堆一半總價值的彈珠的體積就是 x/2 ,那我們只要保證能在容量為 x/2 的揹包中裝下最大的價值(也就是x/2)也就代表彈珠可以對半分了,因此也就轉化為乙個完全揹包問題了。

#include

#include

#include

using namespace std;

int a[7]

,dp[

60001

],v[

100]

;//dp[n]表示為容量n的情況下,最大的價值,v[n]表示為第n個物品的容量值,同時也是第n個物品的價值

intmain()

if(a[i]

)v[ct++

]=a[i]

*i;}

// cout(sum&1)

)}if(dp[sum]

==sum)f=1;

}if(f)printf

("collection #%d:\ncan be divided.\n\n"

,cnt)

;else

printf

("collection #%d:\ncan't be divided.\n\n"

,cnt);}

return

0;

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...

hdu 1059 多重揹包

題目的意思 有一堆大理石,按其大小分為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...

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...