任務說明
本關任務:編寫動態規劃法演算法,求解硬幣抽選問題。
相關知識
為了完成本關任務,你需要了解實驗目的和實驗內容。
實驗目的
(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...