多重揹包優化演算法

2022-05-18 16:29:57 字數 1353 閱讀 6820

二進位制優化

題面:有n中面額的錢,每種有ci個,問1--m裡有多少個數能用這些錢組成。

1

int n,m,a[105],num[105],dp[100005];2

void comdp(int w,intv)3

8void zeroone(int w,intv)9

14void multidp(int w,int v,int cnt)//

此時開始多重揹包,dp[i]表示揹包中重量為i時所包含的最大價值

1521

int k=1;//

否則進行01揹包轉化,具體由**下數學定理可得

22while(k<=cnt)

2328 zeroone(cnt*w,cnt*v);

29return;30

}31intmain()

3238 dp[0]=0;39

for(int i = 0; i < n; i++)

42for(int i = 0; i < n; i++)

45for(int i = 0; i < n; i++)

46multidp(a[i], a[i], num[i]);

47int ans=0;48

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

52 printf("

%d\n

", ans);53}

54return0;

55 }

這裡dp要換成bool陣列表示能否組成的狀態,節省時間。

1

bool

dp[maxn];

2intv;3

p p[maxn];

4void zero(int

cost)5

9void complet(int

cost) 10

14void multi(int cost, int

amount) 15

20int k=1

; 21

while(k26 zero(amount*cost);

27}

28//

多重揹包的二進位制優化 v-揹包總容量 cost-單件物品花費(重量) amount-單件物品數量 weight-單件物品價值

29int

main()

3045

int ans = 0;46

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

49 printf("

%d\n

", ans);50}

51return0;

52 }

python多重揹包 多重揹包

多重揹包問題 有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。資料範圍 0 n v 100 0 vi wi si 100 樸素版多重揹包問題 樸素版完全揹包問...

單調佇列優化多重揹包

多重揹包的最原始的狀態轉移方程 令 c i min num i j v i f i j max f i 1 j k v i k w i 1 k c i 這裡的 k 是指取第 i 種物品 k 件。如果令 a j v i b j v i 那麼 j a v i b.這裡用 k 表示的意義改變,k 表示取第...

單調佇列優化多重揹包

多重揹包 n個物品,揹包承重m,每個物品 重量 wi 價值vi 個數為ci 普通多重揹包複雜度 o nmc for int i 1 i n i for int j 1 j m j for int k 1 k c i k w i j k f i j max f i j f i 1 j k w i k ...