“人民幣找零”問題的貪婪法解決演算法
/*
標題:<<系統設計師>>應試程式設計例項-[遞推演算法程式設計]
作者:成曉旭
時間:2002年09月14日(18:20:00-20:18:00)
實現“裝箱”問題的貪婪演算法實現函式
時間:2002年09月14日(22:00:00-23:18:00)
實現“裝箱”問題的貪婪演算法實現函式
時間:2002年09月14日(18:20:38-22:18:00)
實現“人民幣找零”問題的貪婪法解決演算法
*/
#include "stdio.h"
#include "stdlib.h"
//:============================“人民幣找零”問題的貪婪法解決演算法===========================
/*
作者:成曉旭
時間:2002年09月17日(21:28:38-22:18:00)
完成“人民幣找零”問題的貪婪法解決演算法
===================================================
問題描述:
任何一張面額的紙幣都找成比它的面額小的紙幣,最小單位是元
程式設計思想:
已知,中華人民共和國的紙幣面額分別為:100元、50元、20元、10元、5元、2元、1元,
任何一張較大面額的紙幣,都採用貪婪法首先分解成儘可能大的面額的紙幣。比如50元的紙幣
找零時,首先分解出一個20元,接著在剩餘的30元中,再分解出一個20元,剩餘部分的10元,
可以用一張10元的紙幣來找補。因此,分解結果是:50元 = 20元 + 20元 + 10元。
*/
#define N 20
//找補零錢函式
// int money: 將被找零的面額
// int number: 當前面額money要求被找補的最大允許張數
// int subscript: 面額陣列下標
// int *denomination: 紙幣面額陣列
// int *param: 當前面額money在被要求找補的最大允許張數範圍內,貪婪法解決方案結果
int Give_Change(int money,int number,int subscript,int *denomination,int *param)
{
int result;
if(money == 0) return(0); //已經分解完成
if(number == 0 || subscript == 0) return(-1); //不可能分解
if(money < *denomination) return(Give_Change(money,number,subscript - 1,denomination + 1,param));
else
{
*param = *denomination; //按能找零的最大面額給
//繼續對剩餘金額部分作分解
result = Give_Change(money - *denomination,number - 1,subscript,denomination,param + 1);
if(result >= 0) return(result + 1);
return(-1); //不可能分解
}
}
void Run_Give_Change()
{
int money,number,k,i,dibs[N];
int denomination[7] = {100,50,20,10,5,2,1};
printf("輸入整錢數、找零的最大張數money,number: ");
scanf("%d%d",&money,&number);
for(i = 0;i < 7;i++)
if(money > denomination[i])
break; //跳過面額比它在或相等的紙幣單位
k = Give_Change(money,number,7 - i,&denomination[i],dibs);
if(k <= 0)
printf("面額為[%d]元紙幣想找零成[%d]張零鈔,是找不開! ",money,number);
else
{
printf("%d = %d",money,dibs[0]);
for(i = 1;i < k;i++)
printf(" + %d",dibs[i]);
printf(" ");
}
}
//:============================“人民幣找零”問題的貪婪法解決演算法===========================
int main(int argc, char* argv[])
{
//Encase_Box();
//Journey_Horse();
Run_Give_Change();
printf(" 應用程式執行結束! ");
return 0;
}
標題:<<系統設計師>>應試程式設計例項-[遞推演算法程式設計]
作者:成曉旭
時間:2002年09月14日(18:20:00-20:18:00)
實現“裝箱”問題的貪婪演算法實現函式
時間:2002年09月14日(22:00:00-23:18:00)
實現“裝箱”問題的貪婪演算法實現函式
時間:2002年09月14日(18:20:38-22:18:00)
實現“人民幣找零”問題的貪婪法解決演算法
*/
#include "stdio.h"
#include "stdlib.h"
//:============================“人民幣找零”問題的貪婪法解決演算法===========================
/*
作者:成曉旭
時間:2002年09月17日(21:28:38-22:18:00)
完成“人民幣找零”問題的貪婪法解決演算法
===================================================
問題描述:
任何一張面額的紙幣都找成比它的面額小的紙幣,最小單位是元
程式設計思想:
已知,中華人民共和國的紙幣面額分別為:100元、50元、20元、10元、5元、2元、1元,
任何一張較大面額的紙幣,都採用貪婪法首先分解成儘可能大的面額的紙幣。比如50元的紙幣
找零時,首先分解出一個20元,接著在剩餘的30元中,再分解出一個20元,剩餘部分的10元,
可以用一張10元的紙幣來找補。因此,分解結果是:50元 = 20元 + 20元 + 10元。
*/
#define N 20
//找補零錢函式
// int money: 將被找零的面額
// int number: 當前面額money要求被找補的最大允許張數
// int subscript: 面額陣列下標
// int *denomination: 紙幣面額陣列
// int *param: 當前面額money在被要求找補的最大允許張數範圍內,貪婪法解決方案結果
int Give_Change(int money,int number,int subscript,int *denomination,int *param)
{
int result;
if(money == 0) return(0); //已經分解完成
if(number == 0 || subscript == 0) return(-1); //不可能分解
if(money < *denomination) return(Give_Change(money,number,subscript - 1,denomination + 1,param));
else
{
*param = *denomination; //按能找零的最大面額給
//繼續對剩餘金額部分作分解
result = Give_Change(money - *denomination,number - 1,subscript,denomination,param + 1);
if(result >= 0) return(result + 1);
return(-1); //不可能分解
}
}
void Run_Give_Change()
{
int money,number,k,i,dibs[N];
int denomination[7] = {100,50,20,10,5,2,1};
printf("輸入整錢數、找零的最大張數money,number: ");
scanf("%d%d",&money,&number);
for(i = 0;i < 7;i++)
if(money > denomination[i])
break; //跳過面額比它在或相等的紙幣單位
k = Give_Change(money,number,7 - i,&denomination[i],dibs);
if(k <= 0)
printf("面額為[%d]元紙幣想找零成[%d]張零鈔,是找不開! ",money,number);
else
{
printf("%d = %d",money,dibs[0]);
for(i = 1;i < k;i++)
printf(" + %d",dibs[i]);
printf(" ");
}
}
//:============================“人民幣找零”問題的貪婪法解決演算法===========================
int main(int argc, char* argv[])
{
//Encase_Box();
//Journey_Horse();
Run_Give_Change();
printf(" 應用程式執行結束! ");
return 0;
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=935835
相關文章
- “裝箱”問題的貪婪法解決演算法演算法
- “馬的遍歷”問題的貪婪法解決演算法演算法
- 貪心演算法解硬幣找零問題演算法
- 演算法(六):圖解貪婪演算法演算法圖解
- 貪心演算法(貪婪演算法,greedy algorithm)演算法Go
- 貪婪演算法回顧演算法
- Python 中的貪婪排名演算法Python演算法
- 使用貪心演算法解決集合覆蓋問題演算法
- 正規表示式:貪婪模式與非貪婪模式模式
- 正規表示式貪婪模式與非貪婪模式模式
- 【正規表示式系列】貪婪與非貪婪模式模式
- 探索貪心演算法:解決最佳化問題的高效策略演算法
- 尋路演算法-貪婪最佳優先演算法演算法
- 正規表示式 貪婪模式模式
- 使用動態規劃完美解決硬幣找零問題(Python)動態規劃Python
- 演算法——貪心演算法解0-1揹包問題演算法
- 貪心演算法——換酒問題演算法
- 橡皮鴨子解決問題法
- 解決無法使用VI的問題
- 【GreatSQL最佳化器-04】貪婪搜尋演算法淺析SQL演算法
- 加油站問題(貪心演算法)演算法
- 貪心演算法篇——區間問題演算法
- 跨域問題解決辦法跨域
- 回溯法解決迷宮問題
- 解決機器學習問題有通法機器學習
- 回溯法解決喝酒問題 (轉)
- HTC Vive遇到的問題解決辦法
- veritas netbackup的問題解決辦法
- 解決Centos無法yum源的問題CentOS
- 解決寶塔皮膚無法訪問的問題?
- 【USACO題庫】 Greedy Gift Givers貪婪的禮物送禮者c++C++
- Python RE庫的貪婪匹配和最小匹配Python
- gmail無法訪問問題解決--FGWAI
- 活動選擇問題理解貪心演算法演算法
- 汽車加油問題 SDUT OJ 貪心演算法演算法
- 找零問題與動態規劃動態規劃
- 解決codeblocks無法除錯的問題BloC除錯
- oracle rac asm 問題的官方解決辦法OracleASM