题解 | #百钱买百鸡问题#

百钱买百鸡问题

https://www.nowcoder.com/practice/74c493f094304ea2bda37d0dc40dc85b

这道题很好的复习了回溯,不错

#include <iostream>
#include <bits/stdc++.h>
#include <vector>
using namespace std;
vector<vector<int>>result;
void backtracking(int money,vector<int>ans,int res_sum);
int main() {
    //公鸡一只5块,母鸡一只3块,小鸡三只1块
    int n;
    cin>>n;
    vector<int>ans;
    backtracking(100,ans,100);
    for(auto & i : result){
        for(int j = 0;j<3;j++){
            cout<<i[j]<<" ";
        }
        cout<<endl;
    }
}
void backtracking(int money,vector<int>ans,int res_sum){
    if(ans.size()==3){
        if(money==0&&res_sum==0){
            result.push_back(ans);
        }
        return;
    }
    int n = ans.size();
    if(n==0){//先装公鸡
        for(int i = 0;5*i<=money;i++){
            ans.push_back(i);
            money -= 5*i;
            res_sum -= i;
            backtracking(money, ans, res_sum);
            res_sum += i;
            money += 5*i;
            ans.pop_back();
        }
    }
    else if(n==1){//该装母鸡了
        for(int i=0;3*i<=money;i++){
            ans.push_back(i);
            money -= 3*i;
            res_sum -= i;
            backtracking(money, ans, res_sum);
            res_sum += i;
            money += 3*i;
            ans.pop_back();
        }
    }
    else if(n==2){//该装小鸡了
        for(int i =0;i<=money*3;i+=3){
            ans.push_back(i);
            money -= i/3;
            res_sum -=i;
            backtracking(money, ans, res_sum);
            res_sum +=i;
            money += i/3;
            ans.pop_back();
        }
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

就只能3个月,但是要求长期全职实习
Swaying:你确实是能长期实习啊,但是你那时候有事也没啥办法嘛
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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