合計がkになる部分集合が存在しないように数値を選択するC++プログラム
2つの整数 n と k が与えられます。1から n までの範囲に含まれる相異なる要素の中から、「合計が k に等しくなる部分集合が一つも存在しない」という条件を満たすように、できるだけ多くの要素を選びます。そして、そのような選び方が見つかる場合は、選んだ数値を出力します。
例えば、入力が n = 5、k = 3 の場合、出力は [4, 5, 2] となります。
解法のアプローチ
この問題を解くためには、以下の手順に従います。
i を (k + 1) / 2 から k - 1 まで1ずつ増やしながら繰り返す:
i を出力する
i を k + 1 から n まで1ずつ増やしながら繰り返す:
i を出力する
このアルゴリズムのポイントは、(k + 1) / 2 以上 k 未満の数値と、k より大きい数値を選ぶことです。k より大きい数値は、それ単独でも他の数値との組合せでも、必ず合計が k を超えるため候補になりません。また、(k + 1) / 2 以上の数値を2つ以上足し合わせると必ず k を超えるため、結果的に合計がちょうど k になる部分集合は存在しなくなります。
実装例
理解を深めるために、以下のC++による実装を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
void solve(int n, int k) {
for (int i = (k + 1) / 2; i <= k - 1; i++) {
cout << i << ", ";
}
for (int i = k + 1; i <= n; i++) {
cout << i << ", ";
}
}
int main() {
int n = 5;
int k = 3;
solve(n, k);
}
入力
5, 3
出力
2, 4, 5,
-
最初のn個の自然数の二乗和を求めるC++プログラムの解説
はじめにこの記事では、最初のn個の自然数(1からnまで)の二乗和を求める方法について解説します。例えば、n = 4 の場合、計算結果は 1² + 2² + 3² + 4² = 1 + 4 + 9 + 16 = 30 となります。基本的なアプローチとしては、1からnまで繰り返すforループを使用し、各ステップで項の二乗を計算して合計に加算していく方法があります。このプログラムの計算量は O(n) です。しかし、O(1) の定数時間で解きたい場合は、次の級数の公式を利用できます。Σk² = n(n + 1)(2n + 1) / 6この公式を使えば、ループ処理を行わずに一発で答えを求めることが可能で
-
C++で2つの数値を加算するプログラムの書き方【サンプルコード付き】
加算(足し算)は、最も基本的な算術演算の一つです。2つの数値を加算するプログラムは、指定された2つの数値の合計を計算し、その結果を画面に表示します。この記事では、C++で2つの数値を加算する方法を、変数を使った基本例と配列を使った応用例の2パターンに分けて解説します。例1:変数を使って2つの数値を加算するまずは、最もシンプルな方法です。2つの整数型変数を用意し、その合計を別の変数に格納して出力します。#include <iostream> using namespace std; int main() { int num1 = 15, num2 = 10, sum;