声明:原题目转载自LeetCode,解答部分为原创
Problem :
Given an integer array with all positive numbers and no duplicates, find the number of possible combinations that add up to a positive integer target.
Example:
nums = [1, 2, 3] target = 4 The possible combination ways are: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1) Note that different sequences are counted as different combinations. Therefore the output is 7.
Follow up:
What if negative numbers are allowed in the given array?
How does it change the problem?
What limitation we need to add to the question to allow negative numbers?
Solution :
思路:第二类的背包问题,相较于第一类,每次的操作不再是“针对某一个特定的数值,选择放入或者不放入”,而是“针对所有的数值,选择哪些数值放入,哪些数值不放入”。同时,根据题意,数量与放入的顺序有关,因此应该把这个问题当成排列问题来看待。
假定f(a)为数值之和为a的排列的种类数,则状态转化方程为 f(a) = ∑(f(a - array[ i ])),其中 i 的取值为0,1,2,...n
代码如下:
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int> count_of_sum(target + 1, 0);
count_of_sum[0] = 1;
for(int i = 1; i <= target ; i ++)
{
for(int j = 0 ; j < nums.size(); j ++)
{
if(i - nums[j] >= 0)
count_of_sum[i] += count_of_sum[i - nums[j]];
}
}
return count_of_sum[target];
}
};
int main()
{
Solution text;
vector<int> temp(3,0);
for(int i = 0 ; i < 3; i ++)
temp[i] = i + 1;
cout << text.combinationSum4(temp, 4) << endl;
return 0;
}