当前位置: 首页 > news >正文

C++ 完全背包

完全背包特点:属于线性DP、状态转移方程固定、时间复杂度固定O(nm2  附,这里2是平方)、需要先学习01背包

第一步,状态设计,状态(i,j)表示前i个物品恰好放入容量为j的背包(i属于[0, n],j属于[0, m])。令dp[i][j]表示状态(i, j)下该背包得到的最大价值。

第二步,状态转移方程,dp[i][j] = max(dp[i-1][j-k*c[i]] + k*w[i]) (0 =< k =< j/c[i]),如果“第i个物品不放入容量为j的背包”,那么转态转化为求“前i-1种物品放入容量为j的背包”的问题;由于不放,所以最大价值就等于“前i-1个物品放入容量为j的背包”的最大价值,对应状态转移方程中k=0的情况,即dp[i-1][j]。如果“第i个物品放入容量为j的背包”,那么转态转化为求“前i-1种物品放入容量为j-c[i]*k的背包”的问题;由于不放,所以最大价值就等于“前i-1个物品放入容量为j-c[i]*k的背包”的最大价值加上放入k个第i种物品的价值,即dp[i-1][j-k*c[i]] + k*w[i]。枚举所有满足条件的k就是我们所求的“前i个物品恰好放入容量为j的背包”的最大价值了,dp[i][j] = max([放k个])。

完全背包是01背包的拓展,区别是他可以取0件,1件,,,k件,而01背白只能去0件,1件。如果从转态转移方程出发,可以归纳为以下的方程:

01背包 (0=< k =<1)

完全背包(0=< k =<j)

代码分析:

1 基础常量定义:inf = -1 init = 0

2 最优值定义:

function opt(a, b)

  if a == inf

    return b

  if b == inf

    return a

  return max(a,b)

3 核心代码

function KnapsackComplete(n, m, c[n+1], w[n+1], dp[n+1][m+1])

  dp[0][0] = init

  for i -> (1, m)

    dp[0][i] = inf

  for i -> (1, n)

    for j -> (0, m)

      dp[i][j] = inf

      for k -> (0, j/c[i])

        dp[i][j] = opt(dp[i][j], dp[i-1][j - k*c[i]] + k*w[i])

代码练习 1 对应蓝桥云课 小明的背包2 代码见下

#include <iostream>
using namespace std;#define maxn 1001
#define maxv 1001
#define inf -1
#define init 0
#define vType intvType opt(vType a, vType b){if(a == inf) return b;if(b == inf) return a;return a>b ? a:b;
}
void KnapsackComplete(int n, int V, int w[maxn], vType v[maxv], vType dp[maxn][maxv]){for(int i=1; i<=V; ++i){dp[0][i] = inf;}dp[0][0] = init;for(int i=1; i<=n; ++i){for(int j=0; j<=V; ++j){dp[i][j] = inf;for(int k=0; k<=j/w[i]; ++k){dp[i][j] = opt(dp[i][j], dp[i-1][j - k*w[i]] + k*v[i]);}}}
}int n, V;
int w[maxn];
vType v[maxn];
vType dp[maxn][maxv];int main()
{cin >> n >> V;for(int i=1; i<=n; ++i){cin >> w[i] >> v[i];}KnapsackComplete(n, V, w, v, dp);int ans = inf;for(int i=0; i <= V; ++i){ans = max(ans, dp[n][i]);}cout << ans << endl;// 请在此输入您的代码return 0;
}

http://www.dtcms.com/a/474646.html

相关文章:

  • 【Linux】理解链接过程
  • 广州做网站多少钱怎么做简单的网站首页
  • 【机器人学中的状态估计】7.5.2习题证明:(Cu)^=(2cos(phi)+1)u^-u^C-C^Tu^公式证明
  • Flask、Nginx 与 Docker 的分工与协作
  • 怎么建立一个公司的网站吗ui界面设计作品模板
  • 网站浮动广告怎么做qq开放平台网站开发申请不通过的原因
  • redis中的list命令
  • 对网站建设课程的心得体会北京旅游网页设计
  • 碎片化知识整理利器:NoteGen——AI驱动的免费开源笔记工具使用指南
  • 网站的建设方法包括什么问题高端网站建设大概多少费用
  • RabbitMQ Exchange类型与绑定规则详解
  • 太平洋建设官方网站wordpress 显示分类
  • 比特币私钥位数范围动态估计源代码
  • 随机游走:从布朗运动到PageRank算法的数学之旅
  • 机器学习周报十七
  • DeepCode:从论文到完整软件开发的全自动AI工具
  • 深入探索现代前端开发:从基础到架构的完整指南
  • Sora2高级玩法:超越基础生成的创意新世界(FL去水印送邀请码)
  • 自己怎样优化网站wordpress博客位置
  • 大型购物网站服务器h5页面制作工具易企秀
  • ESP32 + Arduino IDE 开发的 MQTT 通信程序
  • 网站策划哪里找WordPress访问确认
  • Kubernetes YAML配置入门
  • 淘宝网站官网东莞微网站建设多少钱
  • leetcode 118. 杨辉三角 python
  • 中级软件设计师考试选择题——计算机网络典型真题
  • 互联网个人用户网站WordPress移动站
  • ArrayList和LinkedList的区别是什么?(高频)
  • 建设网站的费用属于资产吗广州百度快速排名优化
  • 将 GPU 级性能带到企业级 Java:CUDA 集成实用指南