蓝桥杯 二进制问题 刷题笔记

8.二进制问题 - 蓝桥云课

存入N的二进制每一位作为基准数组 算出方案数

从高位往低位用dfs枚举每一位是放1还是放0

复制代码
#include<iostream>
#include<vector>
#define ll long long
using namespace std;

ll dp[65][65];
ll num;
ll k;
vector<ll> vec;

ll cal(ll n,ll k){
    if(dp[n][k]) return dp[n][k]; //记忆化搜索 如果已经处理过 直接返回C(n,k) 
    if(n==k) return 1;//C(n,n) = 1;
    if(k==0) return 1;//C(n,0) = 1;
    if(n<k) return 0;//n不够位置给K放 直接返回 0 
    return dp[n][k]=cal(n-1,k-1)+cal(n-1,k);
	//n里面选k个位置放1  等于当前位置放1 + 当前位置不放1 的方案数的总和 递归计算 
}


ll dfs(int pos,int last){
	//last 已经放置的K的个数
	//pos当前处理到哪一位了
	 
    //出口 
    if(last==k) return 1;
    if(pos<0||last>k)return 0;
    ll res=0;
    if(vec[pos]==1){
    	//如果当前位置为 1 可以选择放 1 或者放 0  
        res+=cal(pos,k-last);  // 如果选则放0 还剩下pos个位置 (初始一共pos+1个位置 0 到pos) 
		// 这pos个位置随意选k-last个1 所以直接用组合数加上 
        res+=dfs(pos-1,last+1);//当前位置放1 处理下一位 
    }
    else res+=dfs(pos-1,last);//当前位置不为1,保持与原数二进制相等 继续处理下一位 
    
    return res;
}
 



int main(){
    scanf("%lld %d",&num,&k);
    while(num){
        vec.push_back(num%2);
        num/=2;
    }
   
   
//vec.size()  二进制的位数 
//vec.size()-1 最高位的索引 
    cout<<endl;
    
    ll ans=dfs(vec.size()-1,0);
    cout<<ans<<'\n';
    return 0;
}

cal函数的可以算出组合数的原因来自于杨辉三角

由顶层的1 可以加出下面的组合数

相关推荐
星星火柴9361 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
Cx330❀3 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
小幽余生不加糖4 小时前
电路方案分析(二十二)适用于音频应用的25-50W反激电源方案
人工智能·笔记·学习·音视频
..过云雨4 小时前
01.【数据结构-C语言】数据结构概念&算法效率(时间复杂度和空间复杂度)
c语言·数据结构·笔记·学习
岑梓铭5 小时前
考研408《计算机组成原理》复习笔记,第五章(3)——CPU的【数据通路】
笔记·考研·408·计算机组成原理·计组
程序员曦曦6 小时前
10:00开始面试,10:06就出来了,问的问题有点变态。。。
自动化测试·软件测试·功能测试·程序人生·面试·职场和发展
是乐谷8 小时前
阿里云杭州 AI 产品法务岗位信息分享(2025 年 8 月)
java·人工智能·阿里云·面试·职场和发展·机器人·云计算
天才测试猿9 小时前
常见的Jmeter压测问题
自动化测试·软件测试·python·测试工具·jmeter·职场和发展·压力测试
Blossom.11811 小时前
把 AI 推理塞进「 8 位 MCU 」——0.5 KB RAM 跑通关键词唤醒的魔幻之旅
人工智能·笔记·单片机·嵌入式硬件·深度学习·机器学习·搜索引擎
草莓熊Lotso12 小时前
《吃透 C++ 类和对象(中):const 成员函数与取地址运算符重载解析》
c语言·开发语言·c++·笔记·其他