[编程题]数字和为sum的方法数

来源:互联网 发布:linux 启动service 编辑:程序博客网 时间:2024/06/05 01:04

链接:https://www.nowcoder.com/questionTerminal/7f24eb7266ce4b0792ce8721d6259800
来源:牛客网

给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。
当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。

输入描述:
输入为两行:
第一行为两个正整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000)
第二行为n个正整数A[i](32位整数),以空格隔开。

输出描述:
输出所求的方案数

输入例子:
5 15
5 5 10 2 3

输出例子:
4

# include <iostream># include <vector># include <algorithm>using namespace std;long long dp(int m,vector<int> &c){    vector<long long> nums(m+1,0);    for(int i:c){        if (i>m)            continue;        for(int j = m;j>=1;j--){            if(nums[j]>0&&j+i<=m)                nums[j+i] += nums[j];         }        nums[i]++;    }    return nums[m];}int main(){    int n,sum;    cin>>n>>sum;    vector<int> candidates(n,0);    for(int i = 0;i<n;i++){        scanf("%d",&candidates[i]);    }    cout<<dp(sum,candidates);}

建立一个长度为sum的数组,数组表示当前这个数有多少种组合方式。

对输入的每个元素i,若i<=sum,则:
* 数组[i]++
* 对数组的所有元素,数组[j+i]+=数组[j](因为更新是同时进行的,为防止标号小的对大的产生影响,要从大往小更新。 )

不断更新。

0 0
原创粉丝点击