蓝桥杯——凑包子

解题思路:
             背包问题,然后需要求最大公约数。

    ​    ​     ​很容易可以理解,当所有笼包子全部为偶数,比如2,4,6,那完了,有无限多种方案。

             再看一个例子,当全部为3,6,9的时候,能够推出来嘛?也不能,为什么呢?

             好吧,这就要涉及到求最大公约数的问题,第一个例子,公约数为2,第二个公约数为3.



这里直接给出一个结论,当公约数不为1的时候,他们不能组合出来的数,有无限多个,于是用辗转相除法算一下最大公约数即可。



最难理解的是背包,到底状态方程怎么写?



dp[i][j]的意思,前面i个笼子,能不能组合出j,如果能组合出来,dp[i][j]==1,不能组合出来dp[i][j]==0



if(dp[j-arr[i]]==1)dp[j]=1;   这一段是我觉得最难理解的地方,但是想通了就觉得还挺简单的



先来说说,j-arr[i]是什么意思呢?arr[i]里面,存放的是i笼包子存放的包子个数,j-arr[i]就为少一笼包子个数



那么dp[j-arr[i]]又是啥意思,少一笼包子的个数,能不能被组合出来的状态。



我们来看样例,2笼包子,一笼4个,一笼5个。这是我说了,我要吃8个包子,按照这个思路,我们怎么求解?



我是一个懒人,我不想算,那么我就问老板,你可以给我吃4个包子或者3个包子吗?老板说,嗯,我这里一笼有4个,可以给你啊。



4个包子,可以被组合出来,那么8个包子呢,在基础上多加一笼4个包子的 ,不就组合出来了吗。



如果还不理解,我们再看,当我要很多很多包子,但是我还是不想算?这时候,就需要问很多人了



比如20个包子,你问,老板,可以给我16个包子或者15个包子吗?



老板说可以,但是老板也不想算,这时候,他就只好去问他老婆,老婆,可以给我12个包子或者11个包子吗

同时,他又去问他的员工,小明,你可以给我11个包子或者10个包子吗?



我的天哪,他的员工会怎么做,你想一想?依次类推?



那什么人,是可以自己回答的,同时也不需要思考的呢?被问到4笼包子和5笼包子的人,不信你问问我,我直接给你一笼就好了。










注意事项:

参考代码:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值