[C++]69391--和を求める
6121 ワード
目次例題説明 解題構想 コード実装 例題の説明
2つの整数入力説明:試験入力ごとに 出力記述:組み合わせごとに辞書順に並べて出力し、行ごとに組み合わせを出力する.
例1:入力: 出力: 問題を解く構想.
再帰的実現に基づく
問題の解を
解を求める過程で、条件を満たす数字の組み合わせが見つかった場合、例えば結果に入れると、求めるに相当する 結果に入れなければ、求めることに相当する コード実装
リンク:https://www.nowcoder.com/questionTerminal/11cc498832db489786f8a03c3b67d02c
2つの整数
n
とm
を入力し、数列1,2,3.......n
の中から任意に数を取り、和をm
とし、その中のすべての可能な組み合わせを列挙することを要求する.2
個の整数を含むn
およびm
.例1:
5 5
1 4
2 3
5
再帰的実現に基づく
dfs
(深さ優先探索)でよい.これは典型的なリュックサックの問題です.問題の解を
F(n, m)
とすると,2つのサブ問題に分解できるF(n-1, m-n)
とF(n-1, m)
の2つの問題を再帰的に解く.解を求める過程で、条件を満たす数字の組み合わせが見つかった場合、例えば
1, 2, 3, 4, 5
を印刷し、何種類の組み合わせの和が5
であるかを求める.1
この要素については、結果に入れられる可能性があり、結果に入れない可能性があります.2...5
いくつかの数字の和をとる4
.(すなわちF(n-1, m-n)
)2...5
いくつかの数字の和をとる5
.(すなわちF(n-1, m)
)#include <iostream>
#include <vector>
using namespace std;
void help(int n, int m, vector<int>& v, int beg) {
// m == 0 . v . v .
if (m == 0) {
for (int i = 0; i < v.size(); i++) {
// ? : .
i == 0 ? cout << v[i] : cout << " " << v[i];
}
cout << endl;
}
for (int i = beg; i <= n && i <= m; i++) {
// . .
// i -> n m,
// i + 1 -> n m - i
v.push_back(i);
help(n, m - i, v, i + 1);
v.pop_back();
}
}
int main() {
int n, m;
while (cin >> n >> m) {
vector<int>v;
help(n, m, v, 1);
}
}
リンク:https://www.nowcoder.com/questionTerminal/11cc498832db489786f8a03c3b67d02c