演算法 動態規劃 郵票問題

2021-07-04 13:25:34 字數 2607 閱讀 3697

題目描述:

已知乙個 n 枚郵票的面值集合(如,)和乙個上限 k —— 表示信封上能夠貼 k 張郵票。計算從 1 到 m 的最大連續可貼出的郵資。 

例如,假設有 1 分和 3 分的郵票;你最多可以貼 5 張郵票。很容易貼出 1 到 5 分的郵資(用 1 分郵票貼就行了),接下來的郵資也不難: 

6 = 3 + 3 

7 = 3 + 3 + 1 

8 = 3 + 3 + 1 + 1 

9 = 3 + 3 + 3 

10 = 3 + 3 + 3 + 1 

11 = 3 + 3 + 3 + 1 + 1 

12 = 3 + 3 + 3 + 3 

13 = 3 + 3 + 3 + 3 + 1

然而,使用 5 枚 1 分或者 3 分的郵票根本不可能貼出 14 分的郵資。因此,對於這兩種郵票的集合和上限 k=5,答案是 m=13。

輸入:第 1 行: 兩個整數,k 和 n。k(1 <= k <= 200)是可用的郵票總數。n(1 <= n <= 50)是郵票面值的數量。 

第 2 行至末尾: n 個整數,每行 15 個,列出所有的 n 個郵票的面值,面值不超過 10000。

輸出:

乙個整數,從 1 分開始連續的可用集合中不多於 k 張郵票貼出的郵資數。

樣例輸入:

5 21 3

樣例輸出:13

分析:

1.資料分析:每個信封最多貼k(k<=200)張郵票,每張郵票的面值不超過10000,能貼出最大的郵資不超過2000000,可用乙個陣列來表示能夠表示貼出每種郵資。

2.演算法分析:

(1)搜尋:每種郵票最多貼200張,總共50種,樸素的深搜規模將達到50^200。

(2)動態規劃:

<1>階段:能夠構成每個面值為階段。比如能構成的面值為1到v,那麼總共為v個階段。

<2>狀態:dp[i]表示構成面值i所需要的最少郵票數.

<3>決策:對於樣例資料1和3兩種面值的郵票:

構成郵資0:所需要郵票張數為0張,dp[0]=0;

構成郵資1:只能用1分的郵票,所需要郵票張數1張,dp[1]=1;

構成郵資2:只能用1分的郵票,所需要郵票張數2張,dp[2]=1;

構成郵資3:

*1.若選擇使用一張1分的郵票,dp[3]=dp[2]+1=3………dp[3-1]+1

*2.若選擇使用一張3分的郵票,dp[3]=dp[0]+1=1………dp[3-3]+1

dp[3]=min=1;

構成郵資4:

*1.若選擇使用一張1分的郵票,dp[4]=dp[3]+1=2………dp[3-1]+1

*2.若選擇使用一張3分的郵票,dp[4]=dp[1]+1=1………dp[3-3]+1

dp[4]=min=2;

<4>狀態轉移方程:dp[i]=min    i>=a[j]  1<=j<=n    f[i]<=k;

/*

you should use the sta***ard input/output

in order to receive a score properly.

do not use file input and output

please be very careful.

*/#include #include using namespace std;

int answer;

int dp[2000001];

int main(int argc, char** argv)

sort(a, (a + n));

dp[0] = 0;

while (dp[answer] <= k)

}// print the answer to standard output(screen).

cout << "case #" << test_case + 1 << endl;

cout << answer << endl;

deletea;

} return 0;//your program should return 0 on normal termination.

}

演算法 動態規劃問題

一 什麼是動態規劃?動態規劃 dynamic programming 是 運籌學的乙個分支,是求解決策過程 decision process 最優化的數學方法。20世紀50年代初 美國數學家r.e.bellman等人在研究多階段決策過程 multistep decision process 的優化問...

演算法 硬幣問題(動態規劃)

name 硬幣問題 動態規劃 actor ht time 2015年7月20日 error reporte 1.不能得到答案時的限定。該題目中初始化,以及每次迴圈初形態要注意判斷 include stdio.h include conio.h include string.h define n 5 ...

演算法設計 動態規劃問題

適合採用動態規劃 dynamic programming 方法的最優化問題中的兩個要素 最優子結構和重疊子問題。最優子結構 用動態規劃求解最優化問題的第一步就是刻畫最優解的結構,如果乙個問題的解結構包含其子問題的最優解,就稱此問題具有最優子結構性質。因此,某個問題是否適合應用動態規劃演算法,它是否具...