硬幣找錢問題

2022-09-18 03:21:24 字數 2300 閱讀 2982

硬幣找錢問題

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 0
sample output

2
3
source :《演算法設計與分析》

解題思路: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名遊客以什...