[白俊]6603号宝くじ


[白俊]6603号宝くじ


質問リンク:https://www.acmicpc.net/problem/6603

質問する



問題を理解する


これは組み合わせの問題です.与えられた数値内に数値が重複しない組合せを降順に出力する問題.

質問へのアクセス

  • 重複しない数字からなる無順序の組合せ
  • 降順出力
  • 組合せ問題の実装は,dfsを用いるのではなく,dfsにどれだけの情報が含まれているかについてのみ伝達するのではなく,次のfor文から始まるインデックスを同時に伝達する.このように構成すれば、重複しない数字の構成順に関係なく組み合わせてもよいし、降順で出力してもよい.

    コード実装(C++)

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int num;
    vector<int> nums;
    vector<int> result;
    bool check[13] = {false,};
    void dfs(int n, int count){
        if(count == 6){
            for(int i = 0 ; i < 6 ; i++){
                cout << result[i] << " "; 
            }
            cout << "\n";
        }
        else{
            for(int i = n ; i < num ; i++){
                if(!check[i]){
                    check[i] = true;
                    result.push_back(nums[i]);
                    dfs(i + 1, count + 1);
                    check[i] = false;
                    result.pop_back();
                }
            }
        }
    }
    int main(){
        ios_base::sync_with_stdio(false);
        cin.tie(NULL);cout.tie(NULL);
        int temp;
        while(1){
            cin >> num;
            if(num == 0) break;
            for(int i = 0 ; i < num ; i++){
                cin >> temp;
                nums.push_back(temp);
            }
            dfs(0,0);
            nums.clear();
            result.clear();
            cout << "\n";
        }
    }

    評価


    ずっと並べ替え問題を解いていたが,結果的に組合せ問題が発生し,少し戸惑った.そして、全ての入力がなくても、出力を忘れてしまい、配置するために問題が長く掴まれてしまいました.
    今、順番と組み合わせの問題は10分以内に理解して解決できるはずです.あまり複雑でなければ、一生懸命練習してすぐ出てきます.