包子凑数/动态规划/背包问题总结(0-1背包,完全背包)

 

题解: 

首先来系统回顾一下背包问题(0-1背包和完全背包最大不同就是遍历顺序)

0-1背包

1.物品只能拿一次

2.遍历顺序只能倒序

3.先遍历物品,再遍历背包

题型:

1.能够否装满容量为target的背包:return dp[target]==target

for i in range(len(weight)):
    for j in range(bagweight,weight[i]-1,-1):
        dp[j]=max(dp[j],dp[j-weight[i]]+value[i])

2.在一个容量为j的背包,最多能装多少?dp[j]

for i in range(len(weight)):
    for j in range(bagweight,weight[i]-1,-1):
        dp[j]=max(dp[j],dp[j-weight[i]]+value[i])

3.装满容量为j的背包,最多装多少次?dp[j]这种题型最为特殊,初始化dp[0]=1

for i in range(len(nums)):
    for j in range(bagweight,nums[i]-1,-1):
        dp[j]+=dp[j-nums[i]]

4.装满容量为j的背包,用到的物品数量最小为多少?dp[j],初始化dp[j]=math.inf

for i in range(len(nums)):
    for j in range(bagweight,nums[i]-1,-1):
        dp[j]=min(dp[j],dp[j-nums[i]]+1)

完全背包:

1.物品能拿无数次

2.遍历顺序为正序

3.涉及到求组合数时,先遍历物品再遍历背包(拿物品的顺序不能交换时)涉及到求排列数时,先遍历背包再遍历物品(那物品的顺序可以交换)

 题型:

1.能够否装满容量为target的背包:return dp[target]==target

for i in range(len(weight)):
    for j in range(weight[i],bagweight+1):
        dp[j]=max(dp[j],dp[j-weight[i]]+value[i])

2.在一个容量为j的背包,最多能装多少?dp[j]

for i in range(len(weight)):
    for j in range(weight[i],bagweight+1):
        dp[j]=max(dp[j],dp[j-weight[i]]+value[i])

3.装满容量为j的背包,最多装多少次?dp[j]这种题型最为特殊,初始化dp[0]=1

for i in range(len(nums)):
    for j in range(nums[i],bagweight+1):
        dp[j]+=dp[j-nums[i]]

4.装满容量为j的背包,用到的物品数量最小为多少?dp[j],初始化dp[j]=math.inf,这里以先背包后物品举例

for j in range(bagweight+1):
    for i in range(len(nums)):
        if j>=nums[i]:
            dp[j]=min(dp[j],dp[j-nums[i]]+1)

本题即是完全背包中的“能否将背包装满”的问题

什么情况下会有无数个数无法凑出呢?

样例二的输入 3 2 4 6 其实已经给出了答案,如果所有的 ai 不互质,也就是说它们都是某一个大于1的数的倍数,就会有无数个的数无法凑出,毕竟这样的 ai 所能构造出的数都是它们 gcd 的倍数

import os
import sys
import math
# 请在此输入您的代码
n=int(input())
nums=[int(input()) for i in range(n)]
nums.sort()
g=math.gcd(nums[0],nums[1])
for i in range(2,n):
  g=math.gcd(nums[i],g)
if g!=1:
  print("INF")
else:
  bagweight=9999
  dp=[0]*(bagweight+1)
  for i in range(n):
    for j in range(nums[i],bagweight+1):
      dp[j]=max(dp[j],dp[j-nums[i]]+nums[i])
  ans=0
  for i in range(bagweight+1):
    if dp[i]!=i:
      ans+=1
  print(ans)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您正在使用 Ant Design Pro 框架,可以按照以下步骤集成 `@umijs/plugin-qiankun` 插件: 1. 安装插件 使用以下命令安装插件: ```shell npm install @umijs/plugin-qiankun --save-dev ``` 2. 配置主应用 在 `config/config.ts` 文件中,按照以下示例配置主应用: ```javascript export default { qiankun: { master: { // 主应用启动后默认进入的子应用,通常为第一个注册的子应用 defaultApp: '', // 主应用的生命周期钩子,在这里可以初始化主应用的状态 // 例如:在主应用挂载前,初始化一些全局状态 beforeLoad: () => {}, // 挂载主应用 mount: () => {}, // 卸载主应用 unmount: () => {}, }, // 注册的子应用列表 apps: [ { // 子应用名称 name: '', // 子应用的入口地址 entry: '', // 子应用的路由前缀 base: '', // 子应用启动后需要传递给子应用的参数 props: {}, // 子应用的生命周期钩子,在这里可以初始化子应用的状态 // 例如:在子应用挂载前,初始化一些子应用的状态 beforeLoad: () => {}, // 挂载子应用 mount: () => {}, // 卸载子应用 unmount: () => {}, }, // ... 其他子应用 ], // 是否开启调试模式,调试模式下会输出一些额外的信息 debug: true, }, // ... }; ``` 3. 配置子应用 在 `config/config.ts` 文件中,按照以下示例配置子应用: ```javascript export default { qiankun: { slave: { // 子应用的生命周期钩子,在这里可以初始化子应用的状态 // 例如:在子应用挂载前,初始化一些子应用的状态 beforeLoad: () => {}, // 挂载子应用 mount: () => {}, // 卸载子应用 unmount: () => {}, }, }, // ... }; ``` 4. 打包子应用 在子应用的 `package.json` 文件中,添加以下配置: ```json { "name": "child-app", "version": "1.0.0", "scripts": { "build": "umi build --qiankun", // ... }, // ... } ``` 在子应用根目录下,使用以下命令打包子应用: ```shell npm run build ``` 5. 启动主应用 在主应用的根目录下,使用以下命令启动主应用: ```shell npm run start ``` 6. 查看效果 在浏览器中访问主应用的地址,您应该可以看到您的微前端应用的效果了。 更多使用细节,可以参考 `@umijs/plugin-qiankun` 的官方文档。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值