不打字了,直接贴图片吧!我只想说,这sb的题目,你把输入描写清楚好不,到底输不输入n啊,元素顺序是怎么样的啊,真扯淡,最后只过了40%,我都不知道怎么过的。输入顺序都是我自己瞎蒙的。
你看他的输入,还用什么大括号括起来,到底是什么意思。
分析:简单的dp,有限背包问题。先计算所有数的总和,然后除以2,记为s,然后计算和为s的组合方式都多少种,符合题目描述的判重方式。
1 /* 2 ID: y1197771 3 PROG: test 4 LANG: C++ 5 */ 6 #include<bits/stdc++.h> 7 #define pb push_back 8 #define FOR(i, n) for (int i = 0; i < (int)n; ++i) 9 #define dbg(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl 10 typedef long long ll; 11 using namespace std; 12 typedef pair<int, int> pii; 13 const int maxn = 1e6 + 10; 14 int dp[11][maxn / 2]; 15 void solve() { 16 int n; 17 cin >> n; 18 vector<int> cnt(n + 1), val(n + 1); 19 int s = 0; 20 for (int i = 1; i <= n; i++) { 21 cin >> cnt[i]; 22 23 } 24 for (int i = 1; i <= n; i++) { 25 cin >> val[i]; 26 s += cnt[i] * val[i]; 27 } 28 dp[0][0] = 1; 29 s /= 2; 30 for (int i = 1; i <= n; i++) { 31 for (int k = 1; k <= cnt[i]; k++) { 32 for (int j = 1; j <= s; j++) { 33 dp[i][j] += dp[i - 1][j]; 34 //cout << j << " " << k * val[i] << endl; 35 if(j >= k * val[i]) 36 dp[i][j] += dp[i - 1][j - k * val[i] ]; 37 } 38 } 39 //for (int j = 0; j <= s; j++) 40 //cout << j << " " << dp[i][j] << endl; 41 } 42 cout << dp[n][s] << endl; 43 44 } 45 int main() { 46 //freopen("test.in", "r", stdin); 47 //freopen("test.out", "w", stdout); 48 solve(); 49 return 0; 50 }