题解 | #称砝码#
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
#include <iostream> #include <set> #include <vector> using namespace std; int main() { int nums; cin>>nums; int*arrWeight=new int[nums]; int*arrNum=new int[nums]; int temp=0; while(temp<nums) cin>>arrWeight[temp++]; //重量 temp=0; while(temp<nums) cin>>arrNum[temp++]; //个数 std::set<int>ret; //利用set容器不允许存在相同的键 std::vector<int>tempVec1,tempVec2; for(int i=0;i<nums;++i) { for(int j=1;j<=arrNum[i];++j) tempVec1.push_back(arrWeight[i]*j); //先把第i种砝码自身所有重量暂时保存起来 for(int val1:ret) for(int val2:tempVec1) tempVec2.push_back(val1+val2); //然后和保存在set里的重量相加,暂时保存起来 for(int val:tempVec2) ret.insert(val); //保存起来 for(int val:tempVec1) ret.insert(val); //保存第i种砝码自身所有重量 tempVec1.clear(); tempVec2.clear(); } delete[]arrNum; delete[]arrWeight; cout<<ret.size()+1; //包括0 } // 64 位输出请用 printf("%lld")