题解 | #称砝码#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")
纯纯背包