题解 | #称砝码#

称砝码

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

#include<bits/stdc++.h>
using namespace std;

void dfs(unordered_set<int>& res,vector<int>& m, vector<int> used,int index,int sum)
{
    if(index == used.size())
    {
        res.insert(sum);
        return;
    }
    for(int i = index; i < used.size(); i++)
    {
        for(int j = 0; j <= used[i]; j++)
        {
            used[i] -= j;
            dfs(res,m,used,index+1,sum+j*m[i]);
            used[i] += j;
        }
    }
    
}

int main()
{
    //1.先处理输入吧
    int n ;
    cin >> n;
    vector<int> m(n);
    vector<int> x(n);
    for(int i = 0; i < n; i++)
    {
        cin >> m[i];
    }
    for(int i = 0; i < n; i++)
    {
        cin >> x[i];
    }
    //2.debug查看输入数据是否准确保存
//     for(int i = 0; i < n; i++)
//     {
//         cout << m[i] << " ";
//     }
//     cout << endl;
//     for(int i = 0; i < n; i++)
//     {
//         cout << x[i] << " ";
//     }
    //3.计算可以称出来的不同的重量数
//     int count = 1;//初始值为1是因为称重量包括0
    unordered_set<int> res;
    res.insert(0);
//     vector<int> used = x;
    //dfs(res,m,used,0,0);
    unordered_set<int>::iterator it;
    for(int i = 0; i < n; i++)
    {
        for(int j = 1; j <= x[i]; j++ )
        {
            unordered_set<int> temp(res);
            for(it = temp.begin(); it != temp.end(); it++ )
            {
                res.insert(*it + m[i]);
            }
        }
    }
    //4.处理输出
    cout << res.size() << endl;
    
    
    return 0;
}

备注:dfs会超时

全部评论

相关推荐

10-28 10:48
已编辑
门头沟学院 Java
孩子我想要offer:发笔试后还没笔试把我挂了,然后邮箱一直让我测评没测,后面不知道干嘛又给我捞起来下轮笔试,做完测评笔试又挂了😅
点赞 评论 收藏
分享
11-19 18:44
已编辑
成都理工大学 Java
程序员花海:我面试过100+校招生,大厂后端面试不看ACM,竞赛经历含金量低于你有几份大厂实习 这个简历整体来看不错 可以海投
如何写一份好简历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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