リュックサックの問題--Leecode
7174 ワード
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
このバージョンでは、どのリュックサックを先に置いても関係ありませんが、これは位置順があります.
version 2
これは上と何の違いがありますか?一つはtargetが外にあり、一つは物が外にある!!!
例: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が外にあり、一つは物が外にある!!!