题解 | #称砝码#
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
#include <iostream> #include <vector> #include <unordered_set> using namespace std; void solve(int n){ vector<int> weights(n, 0); vector<int> nums(n, 0); for(int i = 0; i < n; ++i){ cin >> weights[i]; } for(int i = 0; i < n; ++i){ cin >> nums[i]; } unordered_set<int> uset; for(int i = 0; i < n; ++i){ int cur = 0; unordered_set<int> tempuset = uset; for(int j = 1; j <= nums[i]; ++j){ cur = weights[i] * j; //不是cur += weights[i] * j if(tempuset.find(cur) == tempuset.end()) uset.insert(cur); for(auto num : tempuset){ if(tempuset.find(cur + num) == tempuset.end()) uset.insert(cur + num); } } } cout << uset.size() + 1 << endl; } int main() { int n; while (cin >> n) { // 注意 while 处理多个 case solve(n); } return 0; } // 64 位输出请用 printf("%lld")