小于N的数

题目要求:给定一个数组arr=[2,3,4,5],N=2345,求使用arr中的数字,组成一个不大于N的最大的数字。arr中的数字可以多次使用。

思路:

首先将arr数组排序,之后使用深搜+贪心的思想,从第一位开始,尽量使用与对应位置相等的数字。如果有任意一位没有使用相等的数字,那在后面的所有位中都直接使用最大的数字即可。

递归终止条件:
1.已经考虑完了所有的位,那么应该返回0
2.在之前选择的基础上,此位置没有满足条件的选择,应当返回-1

边界情况:
1.如果前面都是用了相等的数字,那么最后一位选用的数字必须小于对应的数字。
2.如果在找第一位时,就发现都不相等,那不要立刻返回-1,而是应该放弃第一位,将后面的位都选择最大值。

#include <iostream>
#include <vector>

using namespace std;

vector<int> tmp;
bool backTrack(vector<int>& n, vector<int>&m , int index, bool equal){
    if(index>=n.size()) return true;
    if(equal){
        // 之前的数位都相等,那么当前k的位置只能选小于等于
       for(int i=0; i<m.size(); ++i){
           if (m[i] > n[index]) continue;
           tmp.push_back(m[i]);
           if(backTrack(n, m, index+1, m[i]==n[index])) return true;
           tmp.pop_back();
       }
       // for case n={3,0,0}, m={9,8} 
       if(index==0)
          return backTrack(n, m, index+1, false);
    }else{
        // 不相等,那么选最大的
        tmp.push_back(m[0]);
        if(backTrack(n, m, index+1, false)) return true;
        tmp.pop_back();
    }
    return false;
}


int main() {
    vector<int>n {2,3,1,2,1};
    vector<int>m {9 ,4, 2};
    backTrack(n, m, 0, true);
    for(int i=0; i<tmp.size(); ++i){
        cout<<tmp[i];
    }
}

记录一下

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值