标签:方案 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。
状态转移方程:
然后可以进行空间优化,此处不表。
#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