US硬貨 1$コイン 50セントコイン 25セントコイン 10セントコイン 1セントコインを何枚でも使って、1$を作るとき、一番初めに作れなくなる枚数を求めるプログラムを作りたいのですが、どういったコードを書けばいいのか迷ってます。
質問がわかりづらいと申し訳ないので、補足として
例えば、一枚だったら 1$コインを使って作れます
二枚だったら 50セントコインを2枚使って作れます。枚数を増やしていって、ちなみに答えは77でした。手書きで一応解いてはみたんですが、不規則なパターンがあって、コインを細かくしていく方法ではなかなか難しくてコードができあがりませんでした。
他の金額でも使えるような汎用的なプログラムを作りたいと思っているんですが、どなたか解る方がいたらよろしくお願いします。
No.4ベストアンサー
- 回答日時:
あんまり見本になるようなプログラムじゃないですが、とりあえず、(恥ずかしながら、練習を兼ねて)作ってみました。
汎用的に動くかどうかもテストしてませんけど…
(質問文には、5セントがないけど、#1の補足にはあるから5セントを入れるんですよね?)
1$は、そのままなので、省いています。
/*
50,25,10,5,1セントを使って1$を作る
2枚から始めて、初めて作成できなくなる枚数は?
*/
class CoinCollect {
private static int oneDollar = 100; //一ドル=100セント
private static int kind[] = {50,25,10,5,1};//硬貨の種類
private static int size = kind.length;
private static int piece[] = new int[size];//種類に応じた枚数
private static int result[][] = new int[oneDollar/kind[size-1]+1][size];
public static void main(String args[]){
makeTable(oneDollar,0);//とりあえず作ってみる
for(int i=2; i<=oneDollar/kind[size-1] ; i++){
piece=result[i];
if(totalPiece()!=0){ //枚数が0枚でない時は成功!
piece=result[i];
System.out.print(i+":OK [ ");
for(int j=0;j<size;j++){
System.out.print(kind[j]+":"+piece[j] +" ");
}
System.out.println("]");
} else {
System.out.println(i+"枚の場合は存在しない。");
return ;
}
}
}
static void makeTable(int money, int level){
piece[level]=money/kind[level];
if(level==size-1){
if(money==piece[level]*kind[level]){
int work[] = new int[size];
for(int i=0;i<size;i++)
work[i]=piece[i];
result[totalPiece()]=work;
}
return;
}
while(piece[level]>=0){
makeTable(money - piece[level] * kind[level],level+1);
piece[level]--;
}
}
static int totalPiece(){
int sum=0;
for(int i=0;i<size;i++){
sum+=piece[i];
}
return(sum);
}
}
このプログラムを試してみました!!!
完全に動いてます。そして、合計金額を増やしたり、硬貨の数を増やしたり(実際には紙幣もまぜるようにしたり)しても、完全に動いてました。
たとえば、$20までを、$20札までの紙幣と硬貨を使って求める場合を試してみたのですが、($2札をいれるのといれないので結果は変わってきます)
結果は、$2札をいれた場合1977までのテーブルを作ってくれました!
まだ、ちょっとこのプログラムを理解してないのですが、後でじっくり読んで必ず理解します!
再帰を使った、メソッドを頭で考えるのはどうしたらいいのかよくわかりません。とても難しいですねぇ。。でも、これからいろいろな例をみたりして、勉強したいと思ってます!いつか、BLUEPIXYさんみたいにスグにコードが書けるようになりたいと思ってます。
本当にありがとうございました。
☆ちなみに、大学の課題だったのですが、自分で作ったコードは提出期限には間に合いませんでした(笑)
自分で作ったものはメソッドが汎用化されてなくて、合計が$20の時には完全に動きませんでした。
No.3
- 回答日時:
私が作るなら、1枚どこかのコインを決めて、残りの枚数で残りの
金額を実現できるか、というのを再帰的に繰り返していくような形
を考えます。
具体的には、3枚で実現する場合
1枚目を1ドルとすると残り2枚で0セントだからだめ
1枚目を50セントとすると残り2枚で50セントを実現できるか?
→ 残りのうち100・50では残額を超えるので25セントを1枚として残額25セント
後25セント1枚で実現!
ってな感じでしょうか。
これをプログラム的に落とすと
金額と枚数を渡して実現可能かどうかを返すメソッドをひとつ用意し
この中で、1ドル(100セント)から1セントまで総当りで1枚使うことを仮定し
再度自分自身を呼び出す(引数の金額と枚数を減らすのを忘れないように)
残額0で枚数0ちょうどになったら終わり、って感じですか。
ちなみに馬鹿正直にこのままやると死ぬほど遅いはずなので、
1セント(最後の一種類)を判定するときは残り枚数*1セント=残額だったら終了
とか、前の判定で組み合わせ付加になってる額(今判定している金額より高額の
コインは判定しない)とかそういう判定も入れたほうがいいでしょうね。
あえてプログラム例は載せませんが、がんばってください。
具体的なプログラムの構成教えていただいて、本当にありがとうございました!!
とても、参考になりました。
再帰のメソッドを作るのはまだちょっと僕には難しいですね。でも、もうちょっと練習や勉強をして、自分の頭の中でも考えられるようになりたいと思っています!
ありがとうございました!
No.2
- 回答日時:
それは「解いた」んじゃなくて、単に書いていったら答えがわかっただけですよね?
「答えの求め方」
というのが数式や、アルゴリズムになるんですよ。
だから、まずは「答えの求め方」をちゃんと考えないとダメですね。
となると、javaのカテゴリじゃぁないかな。
でも、最終的にはプログラムを作りたいからここでもいいのか?
No.1
- 回答日時:
手書きで解けたのなら、その通りにプログラムを組めばいいだけでは?
不規則なパターンとはどういうパターンなのでしょう?
おそらく学校か何かの課題だと思いますが、もう少し具体的に質問をしないとダメですよ。
この回答への補足
わかりづらくてすいません。。
質問の続きを書くと、
3枚の時は50セントが一枚と25セントが2枚。
4枚の時は25セントが4枚
5枚の時は50セントが1枚25セントが一枚10セントが2枚5セントが1枚
このように、増えたり減ったりするコインがあったりするので、単純に増やしたり減らしたりするわけにもいかないのです。
表にすると
n $1 50 25 10 5 1
1 1 0 0 0 0 0
2 0 2 0 0 0 0
3 0 1 2 0 0 0
4 0 0 4 0 0 0
5 0 1 1 2 1 0
6 0 1 1 1 3 0
7 0 1 1 0 5 0
8 0 0 2 4 2 0
のように増えていきます。
後のほうになっていくとちょっとはパターン化してくるのですけども。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(悩み相談・人生相談) マッチングアプリで好きになった元彼、初対面である事をされて凄く好きになったんですが、注目する所おかし 1 2022/11/15 18:17
- 数学 相変わらずヘッタクソ!! A君とB君はコインを1枚ずつ投げ、2枚とも表あるいは2枚とも裏が出れば投げ 5 2023/02/06 13:35
- 数学 【 数Ⅰ 仮説検定 】 3 2023/02/27 22:21
- コレクション パチスロのコイン1000枚って 何キロあるのですか? パチスロの台集めてたのですが、 かなり倉庫に7 1 2022/06/12 17:08
- 洋画 『バイオハザードIV アフターライフ』におけるコインとショットガンの組み合わせの謎 1 2023/07/29 08:58
- その他(SNS・コミュニケーションサービス) Yahoo知恵袋について 利用停止されたんですが、2週間経っても使えないので永久停止になったかもしれ 6 2023/04/27 13:04
- iPhone(アイフォーン) xiaomi(シャオミ)というアンドロイドスマホはツムツムには適していませんか? 2 2022/11/06 14:49
- 数学 場合の数、確率 47 (教科書章末問題) 再掲載 2 2023/08/22 11:50
- その他(趣味・アウトドア・車) コインの裏表で選択するってどうなんだろ?ネットでコインの裏表で決めても幸福度に大差は無いと書いてあり 1 2022/04/17 18:49
- その他(IT・Webサービス) 皆さんの意見をお聞かせください 先日犬の写真と名前をプリントするネックレスを購入しました。 コインの 1 2023/06/01 12:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
java キーボード入力された値の...
-
Java、2の0乗~10乗の表示
-
数値⇒漢数字変換 java
-
countに実行した回数をいれたい...
-
学校で課題を出されて困ってい...
-
コマンドライン引数の例外処理...
-
論理演算子”||”またはの入力方法
-
Java 配列<選挙>
-
JAVAのfor文で困っています。
-
Java 入力した整数値の合計を、...
-
テキストボックスに入力された...
-
繰り返しによる星印の出力
-
階乗
-
リトルエンディアン→ビッグエン...
-
配列を逆順させて表示させる方...
-
キーボードから10人分の点数を...
-
3つの値の中間値を求める
-
配列から最大値・最小値
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
Randomメソッドの確率設定
-
論理演算子”||”またはの入力方法
-
テキストボックスに入力された...
-
java キーボード入力された値の...
-
countに実行した回数をいれたい...
-
Java 配列<選挙>
-
総称型ArrayList<E>への参照...
-
Java、2の0乗~10乗の表示
-
2つのスクロールバーを連動させ...
-
数値⇒漢数字変換 java
-
Java 入力した整数値の合計を、...
-
配列を逆順させて表示させる方...
-
エラー(互換性の無い型)
-
javaで数独を解くプログラムに...
-
2次元配列の並び替え
-
javaのエラーが回収できない
-
7つ数字を表示したら改行すると...
-
java 電卓のプログラム
おすすめ情報