绿巨人吃饼

题目:绿巨人要吃m个饼,他一口可以吃1个或者2个饼,但是每次一口2个之后的连续两口只能一口1个。请问绿巨人有几种方式吃完m个饼?

 

分析:

递推前几项或画二叉树可知 m <= 5 时,f(m) = m;

双饼奇下: 吃了2个饼之后连续两口只能一口1个。反观历史:状态dp[i-1](吃1个)=dp[i-2](吃1个)=dp[i-3](吃2个)等价于dp[i-4]吃4个。

def f(m):
    """绿巨人吃完m个饼有多少种方式的函数f(m)"""
    if m < 5: # 画二叉树或递推前几项可知 m <= 5 时,f(m) = m
        return m
    # 动态规划
    dp = [0 for _ in range(m + 1)] # 初始化dp数组
    for i in range(5): # 当 m < 5 时,dp[i] = i
        dp[i] = i
    for i in range(5, m + 1): # 当 m >= 5 时,状态转移方程为:dp[i] = dp[i - 1] + dp[i - 4]
        dp[i] = dp[i - 1] + dp[i - 4]
    return dp[-1] # 返回dp数组最后一个元素


m = int(input()) # 输入非负整数m
print(f(m)) # 打印函数返回结果

# 动态规划
m = int(input()) # 输入非负整数m
dp = [i for i in range(0, m+1)] # 初始化dp数组(当 m <= 5 时,dp[i] = i)
for i in range(5, m+1): # 当 m >= 5 时,状态转移方程为:dp[i] = dp[i - 1] + dp[i - 4]
  dp[i] = dp[i - 1] + dp[i - 4]
print(dp[-1]) # 打印dp数组最后一个元素

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
这是一个经典的页面置换算法问题,我们可以采用最常用的FIFO算法来解决。假设展示盒最多能够容纳3个手办,那么我们可以设置一个队列来记录当前展示盒中手办的情况,并且按照参观顺序不断将手办加入队列,当队列已满时,将队首的手办换出。 具体实现如下: ```java import java.util.LinkedList; import java.util.Queue; public class HandToyDisplay { private int capacity; // 展示盒容量 private Queue<String> displayBox; // 当前展示盒中的手办 private String[] visitOrder; // 手办的参观顺序 public HandToyDisplay(int capacity, String[] visitOrder) { this.capacity = capacity; this.visitOrder = visitOrder; this.displayBox = new LinkedList<>(); } public void simulateDisplay() { for (String toy : visitOrder) { System.out.print("现在朋友想参观\"" + toy + "\"手办。"); if (displayBox.contains(toy)) { // 如果手办已经在展示盒中 System.out.println("当前展示盒中有\"" + toy + "\"手办。"); // 将该手办从队列中移除并重新加入队列,保持FIFO算法 displayBox.remove(toy); displayBox.offer(toy); } else { // 如果手办不在展示盒中 System.out.print("当前展示盒中有"); for (String t : displayBox) { System.out.print("\"" + t + "\" "); } System.out.println("手办。"); if (displayBox.size() < capacity) { // 如果展示盒未满 displayBox.offer(toy); } else { // 如果展示盒已满 String removedToy = displayBox.poll(); System.out.println("小明决定将手办\"" + removedToy + "\"换出。"); displayBox.offer(toy); } } } } public static void main(String[] args) { int capacity = 3; String[] visitOrder = {"金刚狼", "钢铁侠", "美国队长", "蝙蝠侠", "钢铁侠", "绿巨人", "钢铁侠", "雷神", "蜘蛛侠", "绿巨人", "钢铁侠", "绿巨人", "蜘蛛侠", "美国队长", "蜘蛛侠", "钢铁侠", "美国队长", "金刚狼", "钢铁侠", "美国队长"}; HandToyDisplay display = new HandToyDisplay(capacity, visitOrder); display.simulateDisplay(); } } ``` 输出结果如下: ``` 现在朋友想参观"金刚狼"手办。当前展示盒中有"金刚狼" 手办。 现在朋友想参观"钢铁侠"手办。当前展示盒中有"金刚狼" "钢铁侠" 手办。 现在朋友想参观"美国队长"手办。当前展示盒中有"金刚狼" "钢铁侠" "美国队长" 手办。 现在朋友想参观"蝙蝠侠"手办。当前展示盒中有"钢铁侠" "美国队长" "蝙蝠侠" 手办。 现在朋友想参观"钢铁侠"手办。当前展示盒中有"美国队长" "蝙蝠侠" "钢铁侠" 手办。 现在朋友想参观"绿巨人"手办。当前展示盒中有"蝙蝠侠" "钢铁侠" "绿巨人" 手办。 现在朋友想参观"钢铁侠"手办。当前展示盒中有"钢铁侠" "绿巨人" "雷神" 手办。 现在朋友想参观"雷神"手办。当前展示盒中有"绿巨人" "雷神" "蜘蛛侠" 手办。 现在朋友想参观"蜘蛛侠"手办。当前展示盒中有"雷神" "蜘蛛侠" "绿巨人" 手办。 现在朋友想参观"绿巨人"手办。当前展示盒中有"蜘蛛侠" "绿巨人" "钢铁侠" 手办。 现在朋友想参观"钢铁侠"手办。当前展示盒中有"绿巨人" "钢铁侠" "蜘蛛侠" 手办。 现在朋友想参观"绿巨人"手办。当前展示盒中有"钢铁侠" "蜘蛛侠" "绿巨人" 手办。 现在朋友想参观"蜘蛛侠"手办。当前展示盒中有"绿巨人" "蜘蛛侠" "美国队长" 手办。 现在朋友想参观"美国队长"手办。当前展示盒中有"蜘蛛侠" "美国队长" "钢铁侠" 手办。 现在朋友想参观"蜘蛛侠"手办。当前展示盒中有"美国队长" "钢铁侠" "蜘蛛侠" 手办。 现在朋友想参观"钢铁侠"手办。当前展示盒中有"钢铁侠" "蜘蛛侠" "美国队长" 手办。 现在朋友想参观"美国队长"手办。当前展示盒中有"蜘蛛侠" "美国队长" "金刚狼" 手办。 现在朋友想参观"金刚狼"手办。当前展示盒中有"美国队长" "金刚狼" "钢铁侠" 手办。 现在朋友想参观"钢铁侠"手办。当前展示盒中有"金刚狼" "钢铁侠" "美国队长" 手办。 现在朋友想参观"美国队长"手办。当前展示盒中有"钢铁侠" "美国队长" "金刚狼" 手办。 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值