数字组合

Posted waitti

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字组合相关的知识,希望对你有一定的参考价值。

数字组合

给定N个正整数(A_1,A_2,…,A_n),从中选出若干个数,使它们的和为m,求有多少种选择方案。

这个问题是背包问题的一个变型:

设dp[i][j]为前i个数和为j的方案数,显然dp[0][0] = 1;即前0个数和为0的方案数为1。

状态转移方程:

[dp[i][j]\ =\ dp[i - 1][j](不使用第i个数和为j的方案数)\ +\ dp[i - 1][j - t](使用第i个数和为j的方案数,意味着前i - 1个数和为j-t的方案数)\ 其中t为第i个数 ]

然后可以进行空间优化,此处不表。

#include <bits/stdc++.h>

using namespace std;

const int N = 100010;

int dp[N];

int main(){
    int n, m, t;
    cin >> n >> m;
    dp[0] = 1;
    for(int i = 0;i < n; i++){
        cin >> t;
        for(int j = m;j >= t; j--)dp[j] += dp[j - t];
    }
    cout << dp[m] << endl;
}

以上是关于数字组合的主要内容,如果未能解决你的问题,请参考以下文章

如何组合绑定片段而不将它们包装在 XML 文字中

48个值得掌握的JavaScript代码片段(上)

10个JavaScript代码片段,使你更加容易前端开发。

10个JavaScript代码片段,使你更加容易前端开发。

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解!(转载)

golang代码片段(摘抄)