题解 | #称砝码#C++
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
#include <iostream>
using namespace std;
#define WEIGHT 2000 * 10 * 15
int dp[WEIGHT];
int main() {
int n;
cin >> n;
int w[n + 1];
int nums[n + 1];
for (int i = 1; i <= n; i++)
cin >> w[i];
int max_weight = 1;
for (int i = 1; i <= n; i++) {
cin >> nums[i];
max_weight += nums[i] * w[i];
}
// cout << max_weight;
int cur[11];
dp[0] = 1;
for (int i = 1; i <= n; i++) {
for (int k = max_weight - 1; k >= 1; k--) {
for (int j = nums[i]; j >= 1; j--) {
cur[j] = w[i] * j;
if(k >= cur[j])
dp[k] |= dp[k - cur[j]];
}
}
// for(int i = 0; i < max_weight; i++)
// cout << dp[i] << " ";
// cout << endl;
}
int res = 0;
for(int i = 0; i < max_weight; i++)
res += dp[i];
cout << res << endl;
}
// 64 位输出请用 printf("%lld")
纯纯背包
