跳转至

一本通-1291:数字组合(动态规划-硬币问题)

【题目描述】 有n个正整数,找出其中和为t(t也是正整数)的可能的组合方式。如:

n=5,5个数分别为1,2,3,4,5,t=5;

那么可能的组合有5=1+4和5=2+3和5=5三种组合方式。

【输入】 输入的第一行是两个正整数n和t,用空格隔开,其中1≤n≤20,表示正整数的个数,t为要求的和(1≤t≤1000);

接下来的一行是n个正整数,用空格隔开。

【输出】 和为t的不同的组合方式的数目。

【输入样例】 5 5 1 2 3 4 5

【输出样例】 3


#include <bits/stdc++.h>

using namespace std;

int n, target;
vector<int> seq(25), d(1005);
int sum = 0;

int oneZeroPack()
{
    if (target > sum) return 0;
    d[0] = 1;
    for (int i = 0; i < n; ++i) {
        for (int j = target; j >= seq[i]; --j) {
            d[j] += d[j - seq[i]];
        }
    }

    return d[target];
}


int main()
{
    std::ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n >> target;
    for (int i = 0; i < n; ++i) {
        cin >> seq[i];
        sum += seq[i];
    }

    cout << oneZeroPack() << endl;

    return 0;
}

硬币问题或者背包问题,相似的题目是LeetCode 面试题 08.11. 硬币