[バックトラッキング] [leetcode]合計n個になるk個の数値のすべての組み合わせを検索します

トピック:

合計nになるk個の数のすべての組み合わせを見つけます。組み合わせには1から9までの正の整数のみが許可され、各組み合わせで繰り返される数値はありません。

説明:

  • すべての数値は正の整数です。
  • ソリューションセットに繰り返しの組み合わせを含めることはできません。 

例:

入力:k = 3、n = 7
出力:[[1,2,4]]

ソース:

216.組み合わせ合計III

問題解決のアイデア:バックトラック

学習の考えを支持し続けてください、前の(すべての組み合わせ)のこの問題 は直接参照に非常に似ています。

  • 再帰的終了条件:k個を満たす
  • 結果の出力条件:k個を満たす&&合計を満たす
  • 剪定条件:現在の数はk未満ですが、合計はすぐに目標値を超えます

c ++コード:

class Solution {
public:
    vector< vector<int> > result;
    vector<int> path;

    vector< vector<int> > combinationSum3(int k, int n) {
        back(n, 0, k, 1);
        return result;
    }

    // targetSum:目标和,固定值
    // currentSum:当前path中的数字和,动态累加
    void back(int targetSum, int currentSum, int k, int start) {
        if (path.size() == k) {
            if (currentSum == targetSum) {
                result.push_back(path);
            }
            return;
        }
        for (int i = start; i <= 9; i++) {
            if (currentSum + i > targetSum) break; // 剪枝,后面的数字已超出
            currentSum += i;
            path.push_back(i);
            back(targetSum, currentSum, k, i+1);
            currentSum -= i;
            path.pop_back();
        }
    }
};

 

おすすめ

転載: blog.csdn.net/hbuxiaoshe/article/details/114825220
おすすめ