题解 | #称砝码#
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
#include <iostream> #include <unordered_set> #include <vector> using namespace std; int main() { int n; while (cin >> n) { // 注意 while 处理多个 case vector<int> weight(n); vector<int> amount(n); for(int i=0;i<n;i++){ cin>>weight[i]; } for(int i=0;i<n;i++){ cin>>amount[i]; } vector<int> Weight; for(int i=0;i<n;i++){ for(int j=0;j<amount[i];j++){ Weight.push_back(weight[i]); } } int sum=0; for(auto & i:Weight){ sum+=i; } int len=Weight.size(); vector<vector<bool>> dp(len+1,vector<bool>(sum+1,false)); for(int i=0;i<len+1;i++){ dp[i][0]=true; } unordered_set<int> output; for(int i=1;i<len+1;i++){ for(int j=1;j<sum+1;j++){ if (j<Weight[i-1]) { dp[i][j] = dp[i-1][j]; }else { dp[i][j] = dp[i-1][j] || dp[i-1][j-Weight[i-1]]; } if(dp[i][j]){ output.insert(j); } } } cout<<output.size()+1<<endl; } } // 64 位输出请用 printf("%lld")