リュックサックの問題--Leecode


377.組合せ総和IVは、正の整数からなり、重複数が存在しない配列を与え、与えられた目標の正の整数の組合せの個数を探し出し、与える.
例:nums=[1,2,3]target=4
すべての可能な組み合わせは、(1,1,1,1)(1,1,2)(1,2,1)(1,3)(2,1)(2,2)(3,1)(3,1)(3,1)順序の異なるシーケンスが異なる組み合わせと見なされることに注意してください.したがって出力は7です.
この問題は私が見るとリュックサックの問題だ.そこで書き始めました.
version 1
int combinationSum4(vector<int>& nums, int target) {
      int nsize = nums.size();
      vector<int> dp(target+1,0);
      dp[0] = 1;

      for(int i = 0;i < nsize;++i){
          for(int j = nums[i];j <= target;++j){
              dp[j] = dp[j]+dp[j-nums[i]];
          }
      }

      return dp[target];
}

このバージョンでは、どのリュックサックを先に置いても関係ありませんが、これは位置順があります.
version 2
int combinationSum4(vector<int>& nums, int target) {
        int nsize = nums.size();
        vector<int> dp(target+1,0);
        dp[0] = 1;

        for(int i = 1;i <= target;++i){
            for(int j = 0;j < nsize;++j){
                if(nums[j] > i)continue;
                dp[i] = dp[i]+dp[i-nums[j]];
            }
        }

        return dp[target];
    }

これは上と何の違いがありますか?一つはtargetが外にあり、一つは物が外にある!!!