题解 | #称砝码#

称砝码

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

本题需要求能称出多少种重量,可以转化为求子集问题,求子集可以用回溯法实现,但是求出的子集中,某些子集和可能相等,因此还要进一步去重,可以考虑利用set保存子集达到去重的目的。

#include<iostream>
#include<unordered_set>
#include<vector>
#include<algorithm>
using namespace std;
int sum = 0;
unordered_set<int> res;
void backTrack(const vector<int>& input, int beg);
int main(){
    int n = 0;
    while(cin >> n){
        vector<int> weight;
        vector<int> count;
        int a;
        for(int i = 0; i < n; ++i){
            cin >> a;
            weight.push_back(a);
        }
        for(int i = 0; i < n; ++i){
            cin >> a;
            count.push_back(a);
        }
        vector<int> input;
        for(int i = 0; i < weight.size(); ++i){
            for(int j = 0; j < count[i]; ++j){
                input.push_back(weight[i]);
            }
        }
        sort(input.begin(), input.end());
        backTrack(input, 0);
        cout << res.size() << endl;
        sum = 0;
        res.clear();
    }
}
//回溯法实现求解子集
void backTrack(const vector<int>& input, int beg){
    res.insert(sum);
    for(int i = beg; i < input.size(); ++i){
        if(i > beg && input[i] == input[i - 1])
            continue;
        sum += input[i];
        backTrack(input, i + 1);
        sum -= input[i]; //回溯
    }
}
全部评论
10 2000 1999 1998 1997 1996 1995 1994 1993 1992 1991 10 10 10 10 10 10 10 10 10 10 最后一组用例超时了
2 回复 分享
发布于 2022-01-14 20:05
我用java超时了
点赞 回复 分享
发布于 04-10 11:57 陕西
可能每种语言对时限不一样
点赞 回复 分享
发布于 2021-08-25 22:15
为何我用python实现回溯求子***超时呢,算法跟你这一样的。
点赞 回复 分享
发布于 2021-08-25 13:57

相关推荐

12-15 12:50
河北工程大学
sta666:我也是这个国际商业化的,三天,一天一面,就通过了,不过我是后端实习生,好好面感觉能过。
点赞 评论 收藏
分享
评论
7
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务