题解 | #称砝码#
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
#include <iostream> #include <unordered_set> #include <vector> using namespace std; //求所有能组成的重量的种数,并去重。用set 不需要排序,unordered_set即可 //所有重量的组合,遍历种类,每一种已经算出的重量再里加上法码的重量(遍历个数来加),此时每加出一个新重量都insert到set中去 int main() { int n;//种类 cin>>n; vector<int>w(n,0);//记录重量 vector<int>num(n,0);//记录数量 unordered_set<int>mess;//记录会有多少中重量 mess.insert(0); int i=0; for(i=0;i<n;i++){ cin>>w[i];//输入重量 } for(i=0;i<n;i++){ cin>>num[i];//输入个数 } for(i=0;i<n;i++){//遍历有多少种发码 for(int j=1;j<=num[i];j++){//遍历共有多少个发码 unordered_set<int> tmp(mess);//每一次遍历时,mess的大小立即会改变,导致循环次数变多。再改变mess之前先记下此时的大小,不要在内部循环过多次 for(unordered_set<int>::iterator it=tmp.begin();it!=tmp.end();it++){ mess.insert(*it+w[i]); } } } cout<<mess.size()<<endl; }
注意!在vector构建容器时,其中用到了一个动态的变量n,此时一定要先输入n再去构建!不然无法分配内存空间导致整个程序都可能会有问题!!!!!