Combination Sum IV 组合数

来源:互联网 发布:中国汽车销售数据 编辑:程序博客网 时间:2024/05/20 18:19

声明:原题目转载自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 = 4The 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;}



原创粉丝点击