二進位制優化
題面:有n中面額的錢,每種有ci個,問1--m裡有多少個數能用這些錢組成。
1int 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陣列表示能否組成的狀態,節省時間。
1bool
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 ...