トピック:
整数nを与えます。nを3のいくつかの異なる累乗の合計として表すことができる場合は、trueを返します。それ以外の場合は、falseを返します。
整数yの場合、を満たす整数xがある場合、この整数yを3の累乗と呼びます。
例1:
入力:n = 12
出力:true
説明:12 = 31 + 32
促す:
1 <= n <=
ソース:
1780.数値が3の累乗の合計として表現できるかどうかを判断する
問題解決のアイデア:バックトラック
3つすべてが累乗の配列で構成されており、配列からわかります。nは少数の数であり、非常に類似した組み合わせの目標数については、書き込みに従って引き継ぐことができます。
- 3の累乗のグループの数:配列を形成するために事前に各累乗の値を計算します。nは10000000未満であるため、合計15の数値である4782969と計算できます。
- パス:各組み合わせを返す必要がないため、あるかどうかを返すだけで、パス変数を定義する必要はありません。パスがないと、この問題は再帰的な問題としてカウントされる可能性があります。
- 結果は条件を満たしています:現在および目標と一致している
- 剪定条件:見つかった場合、または現在および+後続の数値がnより大きい場合
コードは次のように表示されます。
static int nums[15] = {1,3,9,27,81,243,729,2187,6561,19683,59049,177147,531441,1594323,4782969};
class Solution {
public:
//vector<int> path;
bool ok;
bool checkPowersOfThree(int n) {
ok = false;
back(n, 0, 0);
return ok;
}
void back(int n, int sum, int start) {
if (n == sum) {
ok = true;
return;
}
for (int i = start; i < 15; i++) {
if (ok || sum + nums[i] > n) break;
//path.push_back(nums[i]);
back(n, sum + nums[i], i+1);
//path.pop_back();
}
}
};