给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。
分析:暴搜,2^1000,显然是不行的,1000,1000,数个数,这不是0/1背包么,dp动态规划,然后就ok了。注意结果要用long long来存储。
1 #include<bits/stdc++.h> 2 #define pb push_back 3 #define FOR(i, n) for (int i = 0; i < (int)n; ++i) 4 #define dbg(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl 5 typedef long long ll; 6 using namespace std; 7 typedef pair<int, int> pii; 8 const int maxn = 1e3 + 10; 9 int n, m; 10 long long dp[maxn]; 11 int a[maxn]; 12 void solve() { 13 cin >> n >> m; 14 for (int i = 1; i <= n; i++) cin >> a[i]; 15 dp[0]= 1; 16 for (int i = 1; i <= n; i++) { 17 for (int j = m; j >= a[i]; j--) { 18 dp[j] += dp[j - a[i]]; 19 } 20 } 21 cout << dp[m] << endl; 22 } 23 int main() { 24 //freopen("test.in", "r", stdin); 25 //freopen("test.out", "w", stdout); 26 solve(); 27 return 0; 28 }