前回、Javaで作った支払う硬貨の組合せの数を求めるプログラムのpayCoin()メソッドを使って、「H23 開成中学校 算数 3番」の問題を解いてみました。(^_^;
ただし、扱う数が小さいのでプログラムの省略可能部分は省略してみました。
●Payment02.java
/* * Payment02.java * */ class Payment02 { static final int M = 170;// 0 1 2 3 4 static final int[] Coin = { 1,5,10,50,100}; // 昇順ソート && M%Coin[0]==0 static final int N = Coin.length; static long payCoin(int n, long s) { if (s%Coin[0]!=0) return -1; if (n< 0) return 0; if (n==0) return 1; long r=0, m=s/Coin[n], t=s; for(int i=0; i<=m; i++, t-=Coin[n]){ if (n==1) { r+=1+m; break; } else r+=payCoin(n-1,t); } return r; } public static void main(String[] args) { long tm=System.nanoTime(); // Timer Start int m, min, max; System.out.println("(1) 10野くん : "+payCoin(2,70)+"通り"); System.out.println(" 50川くん : "+payCoin(3,70)+"通り"); System.out.println("(2) "+payCoin(4,M)+"通り"); // M=170 for(max=m=M; payCoin(4,m)!=875; m++); for(min=m; payCoin(4,m)==875; max=m++); System.out.println("(3) "+payCoin(3,min)+"通り"); System.out.println(" 最小 : "+ min+"円"); System.out.println(" 最大 : "+ max+"円"); tm=System.nanoTime()-tm; // Timer Stop System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9); } }
●実行結果
(1) 10野くん : 64通り 50川くん : 73通り (2) 639通り (3) 750通り 最小 : 190円 最大 : 194円 Runtime : 0.003 [sec]
- 作者: 河西朝雄
- 出版社/メーカー: 技術評論社
- 発売日: 2001/06
- メディア: 単行本
- 購入: 2人 クリック: 26回
- この商品を含むブログ (6件) を見る
- 作者: 奥村晴彦,杉浦方紀,津留和生,首藤一幸,土村展之
- 出版社/メーカー: 技術評論社
- 発売日: 2003/05
- メディア: 単行本
- 購入: 2人 クリック: 61回
- この商品を含むブログ (60件) を見る
- 作者: 柴田望洋
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2007/11/07
- メディア: 単行本
- 購入: 5人 クリック: 42回
- この商品を含むブログ (20件) を見る
- 作者: 近藤嘉雪
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2011/01/26
- メディア: 単行本
- 購入: 1人 クリック: 15回
- この商品を含むブログ (5件) を見る