题解 | #最小覆盖子串#

称砝码

http://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c

  • 技巧在于:每遍历一种砝码,都在上一轮所有砝码的集合中迭代
#include <vector>
#include <unordered_set>
#include <algorithm>
#include <iostream>
using namespace std;


int main() {
    int n; // 种类
    vector<int> weights; // 重量
    vector<int> cnt; // 数量
    while(cin >> n) {
        weights.resize(n);
        cnt.resize(n);
        for(int i = 0; i < n; i++) {
            cin >> weights[i];
        }
        for(int i = 0; i < n; i++) {
            cin >> cnt[i];
        }
        
        unordered_set<int> ans;
        ans.insert(0);
        for(int i = 0; i < n; i++) { // 每一种砝码
            for(int j = 1; j <= cnt[i]; j++) { // 用完之前数量之前
                unordered_set<int> temp(ans);
                for(auto iter = temp.begin(); iter != temp.end(); iter++){
                    ans.insert(*iter + weights[i]);
                }
            }
        }

        cout << ans.size() << endl;
    }
}

全部评论

相关推荐

11-01 20:03
已编辑
门头沟学院 算法工程师
Amazarashi66:这种也是幸存者偏差了,拿不到这个价的才是大多数
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务