- 最後登錄
- 2021-9-21
- 在線時間
- 8 小時
- 註冊時間
- 2018-3-9
- 閱讀權限
- 20
- 精華
- 0
- UID
- 171598
- 帖子
- 0
- 積分
- 2 點
- 潛水值
- 360 米
| 若新密碼無法使用,可能是數據未更新。請使用舊密碼看看。 假設要以100元戶10個一元,結果會出來10個一元與9個十元
這應該不太對= =
100 = (1*10) + (50*1) + (10*4)
只要14個就夠了
輸入格式:
[總額] [面額] [個數]
輸入範例:
100 1 10
輸出範例:
1: 10
5: 0
10: 4
50: 1
原理寫在註解裡面
- #include<iostream>
- using namespace std;
- int main(){
- int n, c[]={1,5,10,50}, p[51], v, vn;
- for(int i = 0;i < 4;i++)
- p[c[i]] = i; //拿來放位置,咖方便
- while(cin >> n >> v >> vn){
- int m = 3, cc[4]={0}; //cc[]拿來存結果
- //m為目前最大值在c[]中的位置
- n -= v*vn; //先把總額去掉一定要拿找的錢
- cc[p[v]] += vn; //p[]派上用場了 XD
- while(n > 0 && m >= 0){ //當還有剩下時繼續做
- //m>=0避免超出範圍 (其實如果輸入都符合規定的話,是不需要的)
- if(n/c[m] > 0){ //也可以寫成 n >= c[m]
- cc[m] += (n / c[m]);
- n %= c[m];
- }else
- m--; //剛開始是最大值的位置,如果 n < c[m],則往前(即變小)
- }
-
- //輸出
- for(int i = 0;i < 4;i++){
- cout << c[i] << ": " << cc[i] << endl;
- }
- cout << endl;
- }
- system("pause");
- return 0;
- }
複製代碼
這個方法一般稱為貪婪法(Greedy)
只要想成每次都取最好的答案就夠了
是一種很簡單的演算法
... |
|