题目描述
现有一组砝码,重量互不相等,分别为m1,m2,m3…mn;
每种砝码对应的数量为x1,x2,x3...xn。现在要用这些砝码去称物体的重量,问能称出多少中不同的重量。
注:
称重重量包括0
方法原型:public static int fama(int n, int[] weight, int[] nums)
输入描述:
输入包含多组测试数据。
对于每组测试数据:
第一行:n --- 砝码数(范围[1,10])
第二行:m1 m2 m3 ... mn --- 每个砝码的重量(范围[1,2000])
第三行:x1 x2 x3 .... xn --- 每个砝码的数量(范围[1,6])
输出描述:
利用给定的砝码可以称出的不同的重量数
示例1
输入
2
1 2
2 1
输出
5
分析:开始砝码个数为0,每添加一个砝码把新的砝码总质量添加到集合set中。不懂的看程序注释;
#include<iostream>
#include<vector>
#include<set>
#include<queue>
using namespace std;
inline int getall(vector<pair<int,int>> temp){
if(temp.empty()) return 0;
set<int> t,res;
res.insert(0);t.insert(0);
for(int i=0;i<temp.size();++i){ //遍历每一个砝码;
for(int j=1;j<=temp[i].second;++j){ //砝码个数递增;
set<int>::iterator it=t.begin(); //在已有的砝码质量上增加新的砝码;
while(it!=t.end()){
res.insert(j*temp[i].first+*it);
++it;
}
}
t=res;
}
return res.size();
}
int main(){
int n;
while(cin>>n){// 把砝码的重量和数量保存在vector中;
vector<pair<int,int>> temp;
int t=n,a;
while(t--) {
cin>>a;
temp.push_back(make_pair(a,0));
}
t=0;
while(t<n){
cin>>a;
temp[t++].second=a;
}
cout<<getall(temp)<<endl;
}
return 0;
}