码迷,mamicode.com
首页 > 其他好文 > 详细

数字组合

时间:2020-06-28 20:30:24      阅读:49      评论:0      收藏:0      [点我收藏+]

标签:方案   lin   cout   display   个数   int   组合   bit   names   

数字组合

给定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;
}

数字组合

标签:方案   lin   cout   display   个数   int   组合   bit   names   

原文地址:https://www.cnblogs.com/waitti/p/13204741.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!