C++ 完全背包

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

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

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

dp00 = init

for i -> (1, m)

dp0i = inf

for i -> (1, n)

for j -> (0, m)

dpij = inf

for k -> (0, j/ci)

dpij = opt(dpij, dpi-1j - k\*c\[i] + k*wi)

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

cpp 复制代码
#include <iostream>
using namespace std;

#define maxn 1001
#define maxv 1001
#define inf -1
#define init 0
#define vType int

vType 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;
}
相关推荐
weixin199701080166 分钟前
《淘宝TOP API:落地方案、接口边界与业务踩坑 —— 聚石塔内外价差 10 倍的真相》(附 Python 源码)
开发语言·python
前端 贾公子7 分钟前
LangGraph == 图的状态(State)管理 (上)
java·开发语言·数据库
ForeverYang201515 分钟前
一种无需训练缺陷数据生成算法--O2MAG
人工智能·深度学习·算法
汉克老师30 分钟前
CSP-S 2026 初赛试题解析(第一部分:选择题(8-15))精讲
c++·csp-s·小学生·学c++编程
_wyt00136 分钟前
洛谷 P10112 [GESP202312 八级] 奖品分配 题解
c++·数学·gesp·八级
xuxigifxfh1 小时前
牛客:HJ170 01序列
java·开发语言·算法·华为机考
朝朝辞暮i1 小时前
C++ 第 33 课:事件循环——spin() 到底在干什么
开发语言·c++·算法
野生技术架构师1 小时前
牛客网互联网大厂 Java 高频面试题整理(持续更新)
java·开发语言
殷色玫瑰1 小时前
AVL树:从平衡因子到四种旋转的完整实现
c语言·数据结构·c++·算法·visualstudio
小师兄吃牛肉2 小时前
Java语法 | 多重循环
java·开发语言·python