11周dp 揹包問題

2021-10-06 07:29:43 字數 2732 閱讀 9927

一家銀行計畫安裝一台用於提取現金的機器。

機器能夠按要求的現金量傳送適當的賬單。

機器使用正好n種不同的面額鈔票,例如d_k,k = 1,2,…,n,並且對於每種面額d_k,機器都有n_k張鈔票。

例如,n = 3,

n_1 = 10,d_1 = 100,

n_2 = 4,d_2 = 50,

n_3 = 5,d_3 = 10

表示機器有10張面額為100的鈔票、4張面額為50的鈔票、5張面額為10的鈔票。

東東在寫乙個 atm 的程式,可根據具體金額請求機器交付現金。

注意,這個程式計算程式得出的最大現金少於或等於可以根據裝置的可用票據**有效交付的現金。

程式輸入來自標準輸入。 輸入中的每個資料集代表特定交易,其格式為:cash n n1 d1 n2 d2 … nn dn其中0 <= cash <= 100000是所請求的現金量,0 <= n <= 10是 紙幣面額的數量,0 <= nk <= 1000是dk面額的可用紙幣的數量,1 <= dk <= 1000,k = 1,n。 輸入中的數字之間可以自由出現空格。 輸入資料正確。

對於每組資料,程式將在下一行中將結果列印到單獨一行上的標準輸出中。

樣例輸入:

735 3 4 125 6 5 3 350

633 4 500 30 6 100 1 5 0 1

735 0

0 3 10 100 10 50 10 10

樣例輸出:

73563000

1、這個題是乙個多重揹包的問題,將要組成錢幣的總數看作是揹包容量,每種不同面值的錢幣為一種物品,體積和價值均為錢幣的面值。

2、這裡需要用到的是二進位制拆分。因為在極端情況下,多重揹包的複雜度和未優化的其安全揹包是一樣的,但是由於個數的限制,不能採用完全揹包的優化方式將其優化。二進位制拆分的思想就是將ci 進行二進位制拆分,然後轉化成01揹包的問題。

3、二進位制拆分優化後,第i中物品就分成了0(logci)種物品,原問題的時間複雜度降為 o(n×v×∑logci

)) 的 01 揹包問題,複雜度可以寫為 o(n×v×logt)

#include

#include

#include

using

namespace std;

int w[

1010];

int n[15]

;int v[

1010];

int f[

100010];

int cash,n;

void

init()

intmain()

//分別表示錢的數量和錢的金額

//資料輸入完畢

//f(i,j) = max(f(i-1,j),f(i-1,,) //選取k個物品的價值

//二進位制拆分

int cnt=0;

for(

int i=

1;i <= n;i++)if

(t>0)

} n=cnt;

// 0 1

for(

int i=

1;i<=n;i++)}

int ans = f[cash]

;printf

("%d\n"

,ans);}

return0;

}

東東開車出去泡妞(在夢中),車內提供了 n 張cd唱片,已知東東開車的時間是 n 分鐘,他該如何去選擇唱片去消磨這無聊的時間呢

假設:本題是 special judge

多組輸入

每行輸入第乙個數字n, 代表總時間,第二個數字 m 代表有 m 張唱片,後面緊跟 m 個數字,代表每張唱片的時長 例如樣例一: n=5, m=3, 第一張唱片為 1 分鐘, 第二張唱片 3 分鐘, 第三張 4 分鐘

所有資料均滿足以下條件:

n≤10000

m≤20

輸出所有唱片的時長和總時長,具體輸出格式見樣例

樣例輸入:

5 3 1 3 4

10 4 9 8 4 2

20 4 10 5 7 4

90 8 10 23 1 2 3 4 5 7

45 8 4 10 44 43 12 9 8 2

樣例輸出:

1 4 sum:5

8 2 sum:10

10 5 4 sum:19

10 23 1 2 3 4 5 7 sum:55

4 10 12 9 8 2 sum:45

相關變數做替換就會發現是乙個01揹包問題,比較麻煩的是列印方案。因此第二層迴圈採用順序而不是逆序。

列印方案的時候考慮,從放第i 件物品向前考慮,如果f[i][v]>f[i-1][v],那麼說明第i 件物品放進去了,結果中將第i 件物品的權重放進去。最後列印方案。

#include

#include

#include

using

namespace std;

int w[25]

;int f[25]

[10010];

intmain()

}}int v=n;

for(

int i=m;i>=

1;i--)}

for(

int i=

0;isize()

;i++

)printf

("sum:%d\n"

,f[m]

[n]);}

}

DP 揹包問題

大牛 以下使用滾到陣列 若輸入要求一般,可以邊定義狀態邊輸入,不需儲存 memset f,0,sizeof int n 若求最小值,除 f 0 其餘初始化為 inf,f 0 0是必須的 求最大最小都一樣 確保有從無到有的起點 0 1揹包 一般形式 f i v max f i 1 v f i 1 v ...

揹包問題 DP

01揹包 現在有1個體積為mmax的揹包和n種物品 每種物品只有1個 每種物品的體積和價值分別是v i 和w i 求這個揹包最多可以裝價值多少的物品。這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。用子問題定義狀態 設f i j 表示前i件物品恰放入乙個容量為j的揹包可以獲得的最大...

DP 揹包問題

小明同學在參加一場考試,考試時間2個小時。試卷上一共有n道題目,小明要在規定時間內,完成一定數量的題目。考試中不限制試題作答順序,對於 i 第道題目,小明有三種不同的策略可以選擇 1 直接跳過這道題目,不花費時間,本題得0分。2 只做一部分題目,花費pi分鐘的時間,本題可以得到ai分。3 做完整個題...