Backpack VI

Backpack VI

Description:

Given an integer array nums with all positive numbers and no duplicates, find the number of possible combinations that add up to a positive integer target.

Notice

The different sequences are counted as different combinations.

Example:

Given nums = [1, 2, 4], target = 4. The possible combination ways are:

[1, 1, 1, 1]
[1, 1, 2]
[1, 2, 1]
[2, 1, 1]
[2, 2]
[4]

分析:

这道题和背包问题感觉没有多大的关系,可以用回溯的方法,不过当数据量很多的时候肯定会超时,所以还是用动态规划。

假设dp[i]表示容量为i的时候,总共的可行组合方案数。

由于要计算所有的组合可能数目,所以对于每一个nums[j],如果i >= nums[j],则表示nums[j]可能是某个组合方案里的一个数,此时就需要考虑dp[i-num[j]]有多少种组合方案数目,把这些组合方案数目加到当前的dp[i]中去。

注意:初始化dp[0] = 1,因为当容量为0时,只有一种组合方案:不取任何数。

Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
/**
* @param nums an integer array and all positive numbers, no duplicates
* @param target an integer
* @return an integer
*/
int backPackVI(vector<int>& nums, int target) {
// Write your code here
vector<int> dp(target + 1, 0);
dp[0] = 1;

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

return dp[target];
}
};