質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

6回答

1202閲覧

1,2,3を複数回出力し、合計nになるためのパターンの数を求めるプログラム。

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

1クリップ

投稿2018/01/22 05:27

編集2018/01/22 05:38

課題

ランダムで数字が表示される機械があります。

1回につき1point、2point、もしくは3pointを出力します。
合計{N}point得るためには、何通りの組み合わせがあるか、プログラムを考えなさい。

例:合計{n}が1pointの場合、答は下記の1通りとなる。

1point

###例:合計{n}が2pointの場合、答は下記の2通りとなる。

1point,1point 2point

###例:合計{n}が3pointの場合、答は下記の4通りとなる。

1point,1point,1point 1point,2point 2point,1point 3point

###例:合計{n}が4pointの場合、答は下記の7通りとなる。

1point、1point、1point、1point 1point、1point、2point 1point、2point、1point 1point、3point 2point、1point、1point 2point、2point 3point、1point

組み合わせについて

#include <stdio.h> /*--- 異なるn個からr個の整数を取り出す組み合わせの数を返す ---*/ int combination(int n, int r) { if (r == 0 || r == n) return (1); else if (r == 1) return (n); return (combination(n - 1, r - 1) + combination(n - 1, r)); } int main(void) { int n, r; puts("異なるn個からr個の整数を取り出す組合せの数を求めます。"); printf("n:"); scanf("%d", &n); printf("r:"); scanf("%d", &r); printf("組合せの数は%dです。\n", combination(n, r)); return (0); }

0からコードを作るほど、まだ力がないので、ネットにあるコードを参考にしてプログラムを作ろうと思っていますが、
出力される数字が1or2or3という様に3つのパターンがあるところが今難しく、どういう風にプログラムにしようか考えています。
ご教授やご助言いただける方、いらっしゃったらよろしくお願いします。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

defghi1977

2018/01/22 05:52

とりあえずアルゴリズム的にアプローチする方法と数学的に考える方法の二つを思いついたけれど, 何れにせよ組み合わせ論は必要ですな
Lhankor_Mhy

2018/01/22 06:18

軽くググって見た感じ、これは一般化できる公式が発見されていないようですね。それどころか、順序を考慮しない分割についても一般化できる公式がないようです( https://ja.wikipedia.org/wiki/%E5%88%86%E5%89%B2%E6%95%B0 )。整数マジかよって感じですが。
a_saitoh

2018/01/23 03:10

何通りかの数がわかればそれでいいんでしょうか?それぞれを具体的に書き出さないといけないのでしょうか?前者なら、maisumakunさんの解答のとおりで非常に簡単になります。
guest

回答6

0

ベストアンサー

ほぼ答えに近いですが、結果はトリボナッチ数列の一般項に相当します。

例えば、10ポイントが必要な場合、

  • 最初に1ポイント獲得して、残り9ポイントを取りに行く
  • 最初に2ポイント獲得して、残り8ポイントを取りに行く
  • 最初に3ポイント獲得して、残り7ポイントを取りに行く

という流れなので、n≧4では、パターン数は(n-3のときのパターン数)+(n-2のときのパターン数)+(n-1のときのパターン数)となります。

数学的に一般項も計算できますが、いちばん簡単な計算法としては配列を用意して1から順に計算していくことです。

投稿2018/01/22 06:11

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2018/01/22 06:29

T7=13のようですが、5pointのときは、 1+1+1+1+1 1+1+1+2 1+1+2+1 1+1+3 1+2+1+1 1+2+2 1+3+1 1+4 2+1+1+1 2+1+2 2+2+1 2+3 3+1+1 3+2 4+1 5 の16通りでは。
maisumakun

2018/01/22 06:41

1回に4ポイント以上は取れないので、「1+4」「4+1」「5」の3つが抜けて13通りのはずです。
Lhankor_Mhy

2018/01/22 06:43

うわ、条件を誤読してました。「もしくは」だったのか……
退会済みユーザー

退会済みユーザー

2018/01/26 07:40

maisumakunさん、Lhankor_Mhyさん、ありがとうございました。ハイレベルなやりとりに目が点になっていますが、私自身も数学をもう一度やり直して、いつかついていけるようになりたいです。。。皆さまとにかく凄すぎです。
guest

0

順序つき分割、あるいは、結合、だそうですよ。

分割とは、例えば5という整数を4 + 1や2 + 2 + 1などと表す書き表し方のことをいい、実際に5の分割は、5,4 + 1,3 + 2,3 + 1 + 1,2 + 2 + 1,2 + 1 + 1 + 1,1 + 1 + 1 + 1 + 1の7通りある。分割を表す各正整数のことを和因子といい、ある分割の和因子の並びを入れ替えても同じ分割を表すものとする。従って、分割を表すときは、大きい和因子から小さい和因子へと並べることにする。それに対し、ある分割の和因子の並びを入れ替えたものを別の対象と考えた方がよいこともある。このように和因子の順序を考慮に入れた分割を結合という。例えば、分割で2 + 2 + 1としていたものは、結合では2 + 2 + 1,2 + 1 + 2,1 + 2 + 2の異なる3つの結合と見なす。

整数の結合について

投稿2018/01/22 05:57

Lhankor_Mhy

総合スコア36115

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2018/01/22 05:58

あれ? 質問が変わってる……
guest

0

学校の宿題っぽいので、プログラムそのものを示すのはやめておきます。

おそらく、3+1+3と3+3+1は重複してはいけないのでしょうね?
ならば「3x+2y+1z=nにするようなx,y,zを列挙する」ととらえた方が楽にプログラムが書けると思います。問題の性質から3、2,1の順に個数を確定していった方が楽。
3重forで書けます。

3+1+3と3+3+1は別の答えとしてそれぞれ出力しろと言われたら、深さ優先探索的に再起呼び出しするのがプログラミングは楽そう。

投稿2018/01/22 05:49

a_saitoh

総合スコア702

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2018/01/22 05:54

順番が違うものは別カウントのようです(3ポイント、4ポイントの場合を参照)。
a_saitoh

2018/01/22 06:05

おおそうですね。学校の課題ならそう効率が悪くても動けば合格になるでしょうから,素直に再帰でやるのがいいとおもいます。ていうか、それが説明が楽かな。 一番長い答えが1がn個の長さnだと事前に分かるので、対処しやすい。
otn

2018/01/22 06:30

再帰呼び出しに一票!
Eki

2018/01/22 07:18

計算量の見積りには詳しくないのですが、素直に再帰で行う方法でも引数に応じて値をメモしておけば(いわゆるメモ化再帰)、漸化式で解くのとそう変わらない計算量になりそうですね。 ...ただ、中身の処理が軽すぎるので、むしろ再帰呼び出しのコストが高くつきそうです。
swordone

2018/01/22 13:25

3重もいらないかと。 3の個数、2の個数が確定すれば1の個数は自動的に確定するので。
a_saitoh

2018/01/23 01:13

あ、そうですね。1の個数を確定させるのを最後にするのがキモ
guest

0

「何通りか」さえ数えられればいいのなら以下で。

例えば「10ポイント」で考える。
まずは13ポイントがそれぞれ何回か、その組み合わせを考える。
3ポイントの回数は最大で[10/3]=3回。だから3ポイントの回数として0
3でループする。
仮に3ポイントが2回とする。残りは10-32=4ポイントで、これを1ポイントと2ポイントに割り振る。
2ポイントの回数は最大[4/2]=2回。2ポイントの回数として0~2でループ。
2ポイントを1回とすれば、残りは4-2
1=2ポイント。よって1ポイントは2回。

3ポイントが2回、2ポイントが1回、1ポイントが2回で、あとはこれの並び順の問題。
合計5回分の**同じものを含む順列**と考えれば、このパターンは
5!/(2!1!2!)=30通り。
これをループしながらカウントしていき、総和を取ればいい。
ただし階乗計算のオーバーフローに注意。
階乗が嫌なら5C2*3C1で。

投稿2018/01/22 15:14

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

とりあえず、シェル芸でやってみました。先頭のnに求めたい値を設定します。

bash

1$ n=5;for((i=1;i<=$n;i++));do echo -n 'echo ';jot -b"{1..3}" -s+ $i;done|sh|tr ' ' '\n'|xargs -I@ echo 'echo $((@)) @'|sh|grep "^$n "|sed -E -e's/^.+ (.+)$/\1/' -e's/+/point,/g' -e's/$/point/'|sort 21point,1point,1point,1point,1point 31point,1point,1point,2point 41point,1point,2point,1point 51point,1point,3point 61point,2point,1point,1point 71point,2point,2point 81point,3point,1point 92point,1point,1point,1point 102point,1point,2point 112point,2point,1point 122point,3point 133point,1point,1point 143point,2point

投稿2018/01/22 08:24

編集2018/01/22 08:28
hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

組み合わせです。
組合せ (数学)

投稿2018/01/22 05:30

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/22 05:39

Zuishinさん、ありがとうございます。高校の頃やりました。なかなか覚えてないので調べつつ頑張ってみますね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問