硬幣找錢問題
time limit:1000ms memory limit:65536k
total submit:3 accepted:1
description
設有6 種不同面值的硬幣,各硬幣的面值分別為5 分,1 角,2 角,5 角,1 元,2元。現要用這些面值的硬幣來購物和找錢。購物時可以使用的各種面值的硬幣個數存於陣列coins[1:6]中,商店裡各面值的硬幣有足夠多。在1次購物中希望使用最少硬幣個數。例如,1 次購物需要付款0.55 元,沒有5 角的硬幣,只好用2*20+10+5 共4 枚硬幣來付款。如果付出1 元,找回4 角5 分,同樣需要4 枚硬幣。但是如果付出1.05 元(1 枚1元和1 枚5分),找回5 角,只需要3 枚硬幣。這個方案用的硬幣個數最少。
對於給定的各種面值的硬幣個數和付款金額,計算使用硬幣個數最少的交易方案。
input
輸入資料有若干組,每一行有6 個整數和1 個有2 位小數的實數。分別表示可以使用的各種面值的硬幣個數和付款金額。檔案以6 個0 結束。
output
將計算出的最少硬幣個數輸出。結果應分行輸出,每行乙個資料。如果不可能完成交易,則輸出「impossible」。
sample input
2 4 2 2 1 0 0.95
2 4 2 0 1 0 0.55
0 0 0 0 0 0sample output
2
3source :《演算法設計與分析》
解題思路:01揹包,完全揹包
change[i]表示商店支付面值為i需要的最少硬幣個數;
dp[i]表示顧客現有的硬幣數支付面值為i需要的最少硬幣數;
w為當前要支付的實際面值,若顧客支付面值為k的錢(k>=w),商家找錢k-w,該條件下最少需要的硬幣數為dp[k]+change[k-w],
由此推得,最少硬幣數為所有符合條件k>=w下最小的dp[k]+change[k-w];
即: ans = min(dp[k]+change[k-w])(k>=w)
對於change[i],商店裡各面值的硬幣有足夠多,故可用完全揹包實現
對於dp[i],可用混合揹包計算,這裡我直接拆成01揹包來實現(比較暴力,o(∩_∩)o~)。
ps:為減少空間開銷,最終化為以5分為單位計算
其實,這個演算法在時間和空間上的犧牲還是比較大的,可用貪心進行優化,可惜當年沒深入去想……
**#include
<
stdio.h
>
#include
<
string
.h>
const
intn
=20000
;int
change[n];
//change[i]為面值為i的錢至少需要的硬幣個數
intdp[n];
//dp[i]為當前擁有的硬幣數量條件下表示面值為i的最少硬幣個數
intvalue[6]
=;//每種硬幣對應面值,依次為1,2,4,10,20,40個五分,即5,10,20,50,100,200;
intnumber[6];
//對應於當前擁有的每種硬幣個數
void
init()
//計算change[i]}}
}int
main()
elsew =
w/5;
inti,j;
memset(dp,-1
,sizeof
(dp));
dp[0]=
0;intbigger =0
;for(i=
0;i<6;i
++)//計算顧客支付面值i需要的最少硬幣數dp[i]}}
}}intans =-1
;for(i=
w;i<=
bigger;i
++)//尋找最少硬幣組合}}
//for(i=0;i
//if(dp[i]!=-1)
//printf("dp[%d]=%d\n",i,dp[i]);
if(ans
!=-1
)printf(
"%d\n
",ans);
else
printf(
"impossible\n");
}return0;
}
硬幣找錢問題
設有6種不同面值的硬幣,各硬幣的面值分別為5分 1角 2角 5角 1元和2元。現在要用這些面值的硬幣來購物和找錢。購物時可以使用的各種面值的硬幣個數存於陣列coins 1 6 中,假設商店裡各面值的硬幣有足夠多。對於給定的付款金額,計算使用硬幣個數最少的交易方案。輸入資料的每一行有6個整數和乙個有2...
Problem 找錢問題
time limit 1 sec memory limit 64 mb submit 12397 solved 3423 買火車票時經常會碰到找錢問題。售票員手中有50 20 10 5 1元的錢幣,你知道怎麼找錢才能使找回的零錢張數最少嗎?多組測試資料,輸入需要找錢的錢數 輸出按下面格式 第一行輸出...
遞迴 005 找錢問題
hoji的個人技術部落格 分享乾貨的地方,歡迎來訪,部落格秉持訪客體驗感優先的原則,希望每一位到訪者都心情愉悅 收穫滿滿 公園票價為5角。假設每位遊客只持有兩種幣值的貨幣 5角 1元。再假設持有5角的有m人,持有1元的有n人。由於特殊情況,開始的時候,售票員沒有零錢可找。我們想知道這m n名遊客以什...