题解 | #称砝码#
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
解题步骤:
1、先求0个砝码的情况,重量为0。
2、求每增加一个砝码的所有情况,放入vecw中。
3、前i个砝码的所有情况为:vecw.size(),
4、第i+1个砝码质量是vecm[i],数量为vecx[i],
和前i个砝码组合vecx[i]*vecw.size()种情况,过滤掉相同的重量,加入vecw中。
5、三重循环:
1、砝码数量i从1-n,表示每次增加一个砝码。
2、前i-1个砝码的所有可能情况,j从0-vecw.size(),vecw.size()的值会动态变化,所以要提前取出来保存。
3、第i个砝码的可能数量k从1-vecx[i],0个和i-1的情况重复,所以不用考虑。
#include <iostream> #include <vector> #include <algorithm> using namespace std; size_t Statistic(const vector<int>& vecm, const vector<int>& vecx) { vector<int> ws[11]; vector<int> vecw; int w; //0个砝码的情况 vecw.push_back(0); //每次增加一个砝码,求i+1个砝码的所有组合 for (int i = 0; i < vecm.size(); i++) { auto len = vecw.size(); for (int j = 0; j < len; j++) { for (int k = 1; k <= vecx[i]; k++) { w = vecw[j] + k * vecm[i]; if (find(vecw.begin(), vecw.end(), w) == vecw.end()) { vecw.push_back(w); } } } } cout << vecw.size() << endl; return vecw.size(); } int main() { int n; int m; int x; vector<int> vecm; vector<int> vecx; cin >> n; cin.ignore(1024, '\n'); for (int i = 0; i < n; i++) { cin >> m; vecm.push_back(m); } cin.ignore(1024, '\n'); for (int i = 0; i < n; i++) { cin >> x; vecx.push_back(x); } Statistic(vecm, vecx); return 0; }