本题需要求能称出多少种重量,可以转化为求子集问题,求子集可以用回溯法实现,但是求出的子集中,某些子集和可能相等,因此还要进一步去重,可以考虑利用set保存子集达到去重的目的。
#include<iostream>
#include<unordered_set>
#include<vector>
#include<algorithm>
using namespace std;
int sum = 0;
unordered_set<int> res;
void backTrack(const vector<int>& input, int beg);
int main(){
int n = 0;
while(cin >> n){
vector<int> weight;
vector<int> count;
int a;
for(int i = 0; i < n; ++i){
cin >> a;
weight.push_back(a);
}
for(int i = 0; i < n; ++i){
cin >> a;
count.push_back(a);
}
vector<int> input;
for(int i = 0; i < weight.size(); ++i){
for(int j = 0; j < count[i]; ++j){
input.push_back(weight[i]);
}
}
sort(input.begin(), input.end());
backTrack(input, 0);
cout << res.size() << endl;
sum = 0;
res.clear();
}
}
//回溯法实现求解子集
void backTrack(const vector<int>& input, int beg){
res.insert(sum);
for(int i = beg; i < input.size(); ++i){
if(i > beg && input[i] == input[i - 1])
continue;
sum += input[i];
backTrack(input, i + 1);
sum -= input[i]; //回溯
}
}
京公网安备 11010502036488号