题解 | #称砝码#

称砝码

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

用了排列的组合的方法,耗时比较长,差点没过,不过空间占用比较低。
按砝码种类的数量n递归,从第一个砝码种类开始,依次在该位置放【0,该种砝码数量】个数的砝码,递归,进入下一个位置的放置
边界条件:当递归进入了最后一个位置的下一位,即计算当前的和,压入set中


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


set<int> ans;
void findNum(vector<int> &weight,vector<int> &nums,vector<int> &tmp,int cur,int n)
{
    if(cur==n)
    {
        int ret=0;
        for(int i =0;i<n;i++)
        {
            ret+= weight[i]*tmp[i];
        }
        ans.insert(ret);
        
    }
    else
    {
        for(int i=0;i<=nums[cur];i++)
        {
             tmp[cur]=i;
             findNum(weight,nums,tmp,cur+1,n);
        }
    }
    return;
}


int main()
{
    int n ;
    while(cin>>n)
    {
        vector<int> weight(n);
        vector<int> nums(n);
        for(int i =0;i<n;i++)
        {
            cin>>weight[i];
        }
        //int sum=0;
        for(int i =0;i<n;i++)
        {
            cin>>nums[i];
            //sum+= nums[i]*weight[i];
        }
        vector<int> tmp(n,0);//临时存储各位置当前的个数
        findNum(weight,nums,tmp,0,n);
        cout<<ans.size()<<endl;
        ans.clear();
    }
    return 0;
}




全部评论

相关推荐

嗷佛快来快来快快快来:我当时就是听了别人的谣言,环境的大变,左右摇摆不定,到最后一事无成。我也给你提不了什么有效的建议,因为我自己就是败犬。但是我确实是从cpp转到了Java,cpp也做过项目,了解过具体的细分方向。如果你感兴趣,不会拦你。因为只要一件事情能坚持下去 就会发光
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务