hdu1059 多重揹包優化

2021-09-08 16:46:49 字數 1125 閱讀 6106

使用一種二進位制的優化, 可以完美的解決這題,《揹包九講》中說的非常好

但是還有一種線性複雜的演算法。 應該算是該題很巧妙的解法

for(i=1;i<=6;i++)  

} }

**中total是我們要裝滿的容量, 迴圈的次序很重要。 當關鍵還是那一步剪枝

在附上乙份用二進位制優化多重揹包的**

#include #include 

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define inf 0x3fffffff

struct

node

g[10010]; //

將log2壓縮後的元素存在這裡!

int k[10

];int dp[2002000

];int mpow(int

x)int

main()

if(tmp==0) break

; printf(

"collection #%d:\n

",tt++);

if(sum%2!=0

)

int cnt=0

;

for(int i=1;i<=6;i++)

g[cnt].w=1

; g[cnt].c=i*(k[i]-tmp);

cnt++;

}for(int i=1;i<=sum/2;i++)

dp[0]=0

;

for(int i=0;i)

}if(dp[sum/2]>=0

) printf(

"can be divided.\n");

else printf("

can't be divided.\n");

printf("\n

");}

return0;

}

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

hdu1059 多重揹包

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