1182部分数列の和
Nの最高値は20なので、逆追跡で近づくことができます.
解は解ですが、もっと簡単な解があります.
整数の個数が5の場合
部分数列は1個~5個からなる数列であるべきである.
だから部分的に列を数える.
川が形成されると
2つの数が構成されているとき...
除算して結果値を求めた.
マイコード
#include <iostream>
#include <vector>
using namespace std;
int n, s;
int answer = 0;
vector<int> sequence(30);
void back(int index, int num, int curSum, int total)
{
if (num == total)
{
if (curSum == s)
answer++;
return;
}
for (int i = index; i < n; i++)
back(i + 1, num + 1, curSum + sequence[i], total);
}
int main()
{
cin >> n >> s;
for (int i = 0; i < n; i++)
cin >> sequence[i];
for (int i = 1; i <= n; i++)
back(0, 0, 0, i);
cout << answer;
}
ただしfor文では、構成部分の数列の個数に基づいて値切る必要はありません.
いずれの場合も部分数列の数を形成する.
各要素を選択して求めるかどうかしか考えられません.
単純コード
#include <iostream>
#include <vector>
using namespace std;
int n, s, answer = 0;
vector<int> sequence(30, 0);
void back(int num, int sum)
{
if (num == n)
return;
sum = sum + sequence[num];
if (sum == s)
answer++;
back(num + 1, sum);
back(num + 1, sum - sequence[num]);
}
int main()
{
cin >> n >> s;
for (int i = 0; i < n; i++)
cin >> sequence[i];
back(0, 0);
cout << answer;
}
Reference
この問題について(1182部分数列の和), 我々は、より多くの情報をここで見つけました https://velog.io/@bty5596/1182-부분수열의-합テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol