[BOJ/C+]18429号筋損


この問題は後追跡によって解決された.
  • nのサイクルではツールパッケージは1回しか使用できないため、このツールパッケージが使用されているかどうかを確認するためにbool型のchk配列を宣言します.
  • 日数と現在の重量を表すcurを
  • DFS関数のパラメータで加算します.
  • DFS関数では、dayとnが等しい場合、curが500より大きい場合、cntが増加する.
  • DFS関数では、for文を0からn-1に繰り返し、各繰り返しにインデックスのchkがfalseである場合、cur-k+kit[i]が500以上である場合、DFSを再呼び出します.
  • 呼び出し
  • が再帰される前にchk[i]をtrueに変更し、DFSのパラメータとしてday+1、cur-k+kit[i]を加えて再帰呼び出しを行う.再帰呼び出しの次の行ではすべての状況をチェックする必要があるため、chk[i]をfalseに変更することができます.
  • DFS関数が完了したらcntを出力します.
  • #include <iostream>
    #define MAX 9
    using namespace std;
    
    int n, k;
    int kit[MAX];
    bool chk[MAX];
    int cnt=0;
    
    void Input(){
        cin>>n>>k;
        for(int i=0; i<n; i++){
            cin>>kit[i];
        }
    }
    
    void DFS(int day, int cur){
        if(day==n-1){
            if(cur<500){
                return;
            }
            else{
                cnt++;
                return;
            }
        }
        for(int i=0; i<n; i++){
            if(!chk[i]&&cur-k+kit[i]>=500){
                chk[i]=true;
                DFS(day+1, cur-k+kit[i]);
                chk[i]=false;
            }
        }
    }
    
    int main(){
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        Input();
        DFS(0, 500);
        cout<<cnt<<endl;
        return 0;
    }