这个题我自己没有思路,看的别人的题解,感觉解释的特别清楚
https://github.com/ultraji/nowcoder
这个是她的git地址
利用集合去重的性质
先在集合里面添加0
当第一个砝码进来的时候
{0} 变成 {0,0+1}->{0,1}
当第二个砝码进来之后
{0,1} 变成 {0,1,0+1,1+1}--> {0,1,2}
当第三个砝码进来之后
{0,1,2} 变成{0,1,2,0+2,1+2,2+2}
---》 {0,1,2,3,4}
全部遍历一遍之后结束整个程序即可,这个就是所能得到的所有结果
然后刚开始想的是,能不能直接暴力去求解所有的可能性,这里的话其实有点棘手的就是自己去重的情况,但是set的话刚好就可以不用担心这一步了。
#include <iostream> #include <vector> #include <set> using namespace std; int main() { int n, a[10], tmp; while (cin >> n) { vector<int> v; set<int> s; for(int i = 0; i < n; i++) cin >> a[i]; for(int i = 0; i < n; i++) { cin >> tmp; for(int j = 0; j < tmp; j++) v.push_back(a[i]); } s.insert(0); set<int>::iterator it; for(int i = 0; i < v.size(); i++) { set<int> t(s); for(it = t.begin(); it != t.end(); it ++) { s.insert(*it + v[i]); } } cout << s.size() << endl; } return 0; }