Educoder實驗五硬幣抽選問題

2021-10-12 04:10:46 字數 1662 閱讀 4027

任務說明

本關任務:編寫動態規劃法演算法,求解硬幣抽選問題。

相關知識

為了完成本關任務,你需要了解實驗目的和實驗內容。

實驗目的

(1)熟悉動態規劃法的基本設計思想。

(2)掌握動態方程的推導過程。

(3)掌握硬幣抽選問題的動態規劃法演算法。

實驗內容

硬幣抽選問題:將若干疊硬幣排成一行,每一疊硬幣的價值為整數,標記為c1,c2,…,cn,每一疊的硬幣的價值無序,並且可能存在重複值。抽選硬幣時,一次抽取一疊硬幣,且不能抽取相鄰疊的硬幣。硬幣抽選問題的目標就是從c1…,cn中選出價值最高的組合。

例如:6疊硬幣排成一行,其價值分別為:5, 1, 2, 10, 6, 2,硬幣抽選問題的抽選結果為5, 10, 2,其總價值為17。

實驗原理

(1)用f(n)表示抽選硬幣的最大價值,則f(n)的值可能是以下兩種情況之一:

抽選了第n疊硬幣,第n-1疊硬幣不能選,f(n)的值是前n-2疊硬幣抽選的最大價值加上第n疊硬幣的價值,即:f(n)=f(n-2)+cn;

沒有抽選第n疊硬幣,f(n)的值是前n-1疊硬幣抽選的最大價值,即:f(n)=f(n-1);

(2)由以上分析,可以推出硬幣抽選問題的動態方程為:

(3)用乙個一維陣列記錄f(n)隨n值變化的情況,即可得到硬幣抽選問題的解。

實驗步驟

(1)詳細閱讀問題描述,理解問題;

(2)手工求解問題,得到示例輸入的預期結果;

(3)設計演算法,求解問題;

(4)編寫演算法程式;

(5)除錯、執行程式,保證程式正確輸出預期結果;

(6)分析程式的運**況及演算法效率。

程式設計要求

仔細閱讀右側編輯器中**框架,在begin-end之間補充完整void coin_row(int n, struct coin c, int f)函式,完成硬幣抽選問題,並分析你的演算法效率及優缺點。

測試說明

平台會對你編寫的**進行測試,比對你輸出的數值與實際正確數值,只有所有資料全部計算正確才能通過測試:

測試輸入:

65 1 2 10 6 2

預期輸出:

select coins: 5 10 2

the values of the selected coins: 17

#include

#include

#define max 100

void

coin_row

(int n,

int c,

int f,

int p[

][max]

)int nn=n;

while

(nn)

else

if(f[nn-2]

+c[nn]

>f[nn-1]

)else

}/********** end **********/

}void

set_values

(int

*n,int c)

void

show_result

(int n,

int c,

int f,

int p[

][max]

)int

main()

實驗4 2 4 換硬幣 20分

將一筆零錢換成5分 2分和1分的硬幣,要求每種硬幣至少有一枚,有幾種不同的換法?輸入格式 輸入在一行中給出待換的零錢數額x 8,100 輸出格式 要求按5分 2分和1分硬幣的數量依次從大到小的順序,輸出各種換法。每行輸出一種換法,格式為 fen5 5分硬幣數量,fen2 2分硬幣數量,fen1 1分...

實驗4 2 4 換硬幣 20分

將一筆零錢換成5分 2分和1分的硬幣,要求每種硬幣至少有一枚,有幾種不同的換法?輸入在一行中給出待換的零錢數額x 8,100 要求按5分 2分和1分硬幣的數量依次從大到小的順序,輸出各種換法。每行輸出一種換法,格式為 fen5 5分硬幣數量,fen2 2分硬幣數量,fen1 1分硬幣數量,total...

DP經典應用(五)硬幣問題

問題描述 題目 有n種硬幣,面值分別為v1,v2,vn,每種都有無限多。給定非負整數s,可以選用多少個硬幣,使得面值之和恰好為s?輸出硬幣數目的最小值和最大值 分析 按照解決動態規劃的前3個步驟我們進行分析 include include include using namespace std co...