二进制在编程中的应用 教学PPT课件.pptx

二进制在编程中的应用 教学PPT课件.pptx

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
二进制在编程中的应用;摘要:二进制算法是一种十分实用的方法,在许多方面都有重要的应用。在编程中灵活运用二进制,利用二进制的一些重要性质,会起到意想不到的效果。 关键词:二进制;动态规划;树状数组;多重背包;线段树; 二进制(binary)在数学和数字电路中指以2为基数的记数系统,以2为基数代表系统是二进位制的。数字电子电路中,逻辑门的实现直接应用了二进制,因此现代的计算机和依赖计算机的设备里都用到二进制。在具体编程中,二进制也有重要的作用。;第一部分 “0”与“1”既可以表示逻辑,也 可以表示“有”或“无”。在动态 规划状态压缩算法中,巧妙地用二 进制递推。;一、题目:X?行Y?列的棋盘,还有很多完全相同的马(你可以认为有无数个)。现在在棋盘上摆上马(或者不摆),求任何马无法攻击另一匹马的方案总数。;关键代码: for(register int i=3; i=x; ++i) { for(register int j=0; j (1y); ++j) { for(register int k=0; k (1y); ++k) { if(at_bt(k)j||at_bt(j)k) continue; for(register int s=0; s (1y) ; ++s) { if(at_bt(s)k|| at_bt(k)s ||at_3(s,k)j || at_3(j,k)s) continue; dp[i][j][k]+=dp[i-1][k][s]; dp[i][j][k]%=mod; } } } }; 在此题中,巧妙地运用整数的二进制表示某行每个位置马的有无,从而轻松递推出最后结果。;第二部分 二进制每一位数字都表示2的n次方, 则每一个数k都可以表示成 个 数的和; 题目:有 N 种物品和一个容量是 V 的背包,第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi,求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大. 输出最大价值。;代码: cinnm; for(register int i=0;in;i++){ int vv,ww,s; cinvvwws; for(register int i=1;i=s;i*=2) //二进制优化 v[k]=vv*i,w[k++]=ww*i,s-=i; if(s0) v[k]=vv*s,w[k++]=ww*s; } for(register int i=0;ik;i++) //01背包 for(register int j=m;j=v[i];j--) dp[j]=max(dp[j],dp[j-v[i]]+w[i]);; 在多重背包问题中,将每一个数的n倍表示成几个数??和,保证合理性的同时亦大幅提升了速度。;第三部分 “1”本身是一个数字,表示“一 个”,将其当作储存数据的空间, 通过一定的结构联系起来,可以起 到重要的作用。;题目:已知一个数列,你需要进行下面两种操作: 1、将某一个数加上?x 2、求出某区间每一个数的和;代码: #define lowbit(a) ((a)-(a)) void update(int x,int y,int n){ for(int i=x;i=n;i+=lowbit(i)) c[i] += y; } int getsum(int x){ int ans = 0; for(int i=x;i;i-=lowbit(i)) ans += c[i]; return ans; }; 这是树状数组的解法,相对方便,而用途更为广泛的解法是用线段树。;inline ll rs(ll x){ return x1|1; } void scan(){ cinnm; for(ll i=1;i=n;i++) scanf(%lld,a[i]); } inline void push_up(ll p){ ans[p]=ans[ls(p)]+ans[rs(p)]; };void build(ll p,ll l,ll r){ tag[p]=0; if(l==r){ans[p]=a[l];return ;} ll mid=(l+r)1; build(ls(p),l,mid); build(rs(p),mid+1,r); push_up(p); } inline void f(ll p,ll l,ll r,ll k){ tag[

文档评论(0)

liuxing044 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档