ブルーブリッジ:およびTについて

そして用T

問題の説明
⼩ズーム⼀nは整数⼀彼らが所定値Tに等しくなるようにこれらの元素の濃度は、選択されました各要素の上限は1つが選択されていない⼀できず、⼀回選択しました。
START入力フォーマット
最初のフレーム⾏⼀正の整数n-は、整数の集合内の要素の数を表します。
セカンドショット⾏ n個のスペースを使用することで区切られた整数、。
T整数⼀⾏第三、及び達成することを約束。
出力フォーマット
存在する場合、すなわちドライ⾏出力、各⾏⼀ソリューションの出力は、選択された数は、入力STARTの順に配置されています。
最優先含む溶液の複数のセットは、出力されない場合はN の整数、含有又は含有しない場合、優先第一出力含まない、n-1の整数を
などなど。総出力最後のフレーム⾏⽅場合。
サンプルを失うSTART
5
-7 -3 -2 5 9
0
サンプル出力
-3 -2 5
-7 -2 9
2
スケールデータと規則
1 <= N <= 22 T <= maxlongint
要素の集合とどんな超えない 長い 範囲を
分析:1スケールのデータのn <= 22、再帰検索はないテイクに各数値を取るか選択することが、タイムアウトしません
           2.タイトル先時間の検索順序の遵守を確保するためには、フロントに戻ってから検索 -

 

#include <iostream>
#include <vector>
using namespace std;
vector<int> v, ans;
int n, k, cnt;
void dfs(int num, int sum) {
 if (num == -1) {
    if (sum == k && ans.size() > 0) {
        for (int i = ans.size() - 1; i >= 0; i--) {
             if (i != 0) {
                 printf("%d ", ans[i]);
             } else {
                 printf("%d\n", ans[i]);
             }
        }
        cnt++;
    }
 } else {
   dfs(num - 1, sum);
   ans.push_back(v[num]);
   dfs(num - 1, sum + v[num]);
   ans.pop_back();
 }
}
int main() {
 scanf("%d", &n);
 v.resize(n);
 for (int i = 0; i < n; i++)
      scanf("%d", &v[i]);
 scanf("%d", &k);
 dfs(n - 1, 0);
 printf("%d\n", cnt);
 return 0;
}

 

公開された736元の記事 ウォンの賞賛123 ・は 80000 +を見て

おすすめ

転載: blog.csdn.net/S_999999/article/details/103390025