本题需要求能称出多少种重量,可以转化为求子集问题,求子集可以用回溯法实现,但是求出的子集中,某些子集和可能相等,因此还要进一步去重,可以考虑利用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]; //回溯 } }