动规核心思想是上一次的状态决定下一次的状态,姑且算是吧。

因为需要使用每次循环结束时的状态,而循环中的状态时刻在变,所以set需要一个副本记录上一次循环结束时的状态。

#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;

int diffW(vector<int> w){
    unordered_set<int> res;
    for(int i = 0; i < w.size(); i ++){
        unordered_set<int> new_set = res;

        res.insert(w[i]);
        for(auto j : new_set) res.insert(j + w[i]);
    }

    return res.size() + 1; //考虑没有砝码的情况
}


int main() {
    int N;
    cin >> N;
    vector<int> weight(N);
    for(int i = 0; i < N; i ++){
        cin >> weight[i];
    }
    vector<int> num(N);
    for(int i = 0; i < N; i ++){
        cin >> num[i];
    }

    vector<int> w;
    for(int i = 0; i < N; i ++){
        for(int j = 0; j < num[i]; j ++) w.push_back(weight[i]);
    }

    cout << diffW(w) << endl;

    return 0;
}
// 64 位输出请用 printf("%lld")