这个题我自己没有思路,看的别人的题解,感觉解释的特别清楚
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;
}