C++ 进阶动态规划(小明的背包3)

进阶动态规划,对应蓝桥云课小明的背包3 代码框架见下

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

#define maxn 101
#define maxc 10
#define maxv 201
#define inf -1
#define init 0
#define vType int

vType opt(int a, int b){
  if(a == inf) return b;
  if(b == inf) return a;
  return a > b ? a : b;
}

void Knapsack01(int n, int V, int w[maxn*maxc], vType v[maxn*maxc], vType dp[maxv]){
  // 1 初始化
  for(int i=1; i <= V; ++i){
    dp[i] = inf;
  }
  dp[0] = init;
  // 2 状态转移
  for(int i=1; i<=n; ++i){
    for(int j=V; j >= w[i]; --j){
      dp[j] = opt(dp[j], dp[j - w[i]] + v[i]);
    }
  }

}

void knapsackMultiple(int n, int V, int w[maxn], vType v[maxn], int c[maxn], vType dp[maxv]){
  int m=0; // 拆分以后,物品数量就是m了,不再是n
  int nw[maxn * maxc];
  vType nv[maxn * maxc];
  for(int i=1; i <= n; ++i){
    int k = 1;
    while(k < c[i]){
      ++m;
      nw[m] = k*w[i];
      nv[m] = k*v[i];
      c[i] -= k;
      k *= 2;
    }
    if(c[i]){
      ++m;
      nw[m] = c[i]*w[i];
      nv[m] = c[i]*v[i];
    }
  }
  Knapsack01(m, V, nw, nv, dp);

}

int w[maxn], c[maxn];
vType v[maxn];
vType dp[maxv];

int main()
{
  int n, V;
  cin >> n >> V;
  for(int i=1; i<=n; ++i){
    cin >> w[i] >> v[i] >> c[i];
  }
  knapsackMultiple(n, V, w, v, c, dp);
  vType ret = 0;
  for(int i=0; i <= V; ++i){
    ret = opt(ret, dp[i]);
  }
  cout << ret << endl;
  // 请在此输入您的代码
  return 0;
}

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

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

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

vType opt(int a, int b){
  if(a == inf) return b;
  if(b == inf) return a;
  return a > b ? a : b;
}

void Knapsack01(int n, int V, int w[maxn*maxc], vType v[maxn*maxc], vType dp[maxv]){
  // 1 初始化
  for(int i=1; i <= V; ++i){
    dp[i] = inf;
  }
  dp[0] = init;
  // 2 状态转移
  for(int i=1; i<=n; ++i){
    for(int j=V; j >= w[i]; --j){
      dp[j] = opt(dp[j], dp[j - w[i]] + v[i]);
    }
  }

}

void knapsackMultiple(int n, int V, int w[maxn], vType v[maxn], int c[maxn], vType dp[maxv]){
  int m=0; // 拆分以后,物品数量就是m了,不再是n
  int nw[maxn * maxc];
  vType nv[maxn * maxc];
  for(int i=1; i <= n; ++i){
    int k = 1;
    while(k < c[i]){
      ++m;
      nw[m] = k*w[i];
      nv[m] = k*v[i];
      c[i] -= k;
      k *= 2;
    }
    if(c[i]){
      ++m;
      nw[m] = c[i]*w[i];
      nv[m] = c[i]*v[i];
    }
  }
  Knapsack01(m, V, nw, nv, dp);

}

int w[maxn], c[maxn];
vType v[maxn];
vType dp[maxv];

int main()
{
  int n, V;
  cin >> n >> V;
  for(int i=1; i<=n; ++i){
    cin >> w[i] >> v[i] >> c[i];
    if(c[i] == 0) c[i] = 2000;
  }
  knapsackMultiple(n, V, w, v, c, dp);
  vType ret = 0;
  for(int i=0; i <= V; ++i){
    ret = opt(ret, dp[i]);
  }
  cout << ret << endl;
  // 请在此输入您的代码
  return 0;
}

代码2 新一的宝藏搜寻加强版 对应蓝桥云课

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

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

vType opt(int a, int b){
  if(a == inf) return b;
  if(b == inf) return a;
  return a > b ? a : b;
}

void Knapsack01(int n, int V, int w[maxn*maxc], vType v[maxn*maxc], vType dp[maxv]){
  // 1 初始化
  for(int i=1; i <= V; ++i){
    dp[i] = inf;
  }
  dp[0] = init;
  // 2 状态转移
  for(int i=1; i<=n; ++i){
    for(int j=V; j >= w[i]; --j){
      dp[j] = opt(dp[j], dp[j - w[i]] + v[i]);
    }
  }

}

void knapsackMultiple(int n, int V, int w[maxn], vType v[maxn], int c[maxn], vType dp[maxv]){
  int m=0; // 拆分以后,物品数量就是m了,不再是n
  int nw[maxn * maxc];
  vType nv[maxn * maxc];
  for(int i=1; i <= n; ++i){
    int k = 1;
    while(k < c[i]){
      ++m;
      nw[m] = k*w[i];
      nv[m] = k*v[i];
      c[i] -= k;
      k *= 2;
    }
    if(c[i]){
      ++m;
      nw[m] = c[i]*w[i];
      nv[m] = c[i]*v[i];
    }
  }
  Knapsack01(m, V, nw, nv, dp);

}

int w[maxn], c[maxn];
vType v[maxn];
vType dp[maxv];

int main()
{
  int n, V;
  cin >> n >> V;
  for(int i=1; i<=n; ++i){
    cin >> w[i] >> v[i] >> c[i];
  }
  knapsackMultiple(n, V, w, v, c, dp);
  vType ret = 0;
  for(int i=0; i <= V; ++i){
    ret = opt(ret, dp[i]);
  }
  cout << ret << endl;
  // 请在此输入您的代码
  return 0;
}

代码练习3 对应蓝桥云课 鲁邦的甜品店 代码见下

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

#define maxn 101
#define maxc 10
#define maxv 201
#define inf -1
#define init 0
#define vType int

vType opt(int a, int b){
  if(a == inf) return b;
  if(b == inf) return a;
  return a > b ? a : b;
}

void Knapsack01(int n, int V, int w[maxn*maxc], vType v[maxn*maxc], vType dp[maxv]){
  // 1 初始化
  for(int i=1; i <= V; ++i){
    dp[i] = inf;
  }
  dp[0] = init;
  // 2 状态转移
  for(int i=1; i<=n; ++i){
    for(int j=V; j >= w[i]; --j){
      dp[j] = opt(dp[j], dp[j - w[i]] + v[i]);
    }
  }

}

void knapsackMultiple(int n, int V, int w[maxn], vType v[maxn], int c[maxn], vType dp[maxv]){
  int m=0; // 拆分以后,物品数量就是m了,不再是n
  int nw[maxn * maxc];
  vType nv[maxn * maxc];
  for(int i=1; i <= n; ++i){
    int k = 1;
    while(k < c[i]){
      ++m;
      nw[m] = k*w[i];
      nv[m] = k*v[i];
      c[i] -= k;
      k *= 2;
    }
    if(c[i]){
      ++m;
      nw[m] = c[i]*w[i];
      nv[m] = c[i]*v[i];
    }
  }
  Knapsack01(m, V, nw, nv, dp);

}

int w[maxn], c[maxn];
vType v[maxn];
vType dp[maxv];

int main()
{
  int V, n, c0, d0;
  cin >> V >> n >> c0 >> d0;
  w[1] = c0;
  c[1] = V/c0;
  v[1] = d0;
  for(int i=2; i <= n+1; ++i){
    int ai, bi, ci, di;
    cin >> ai >> bi >> ci >> di;
    w[i] = ci;
    c[i] = ai / bi;
    v[i] = di;
  }
  knapsackMultiple(n+1, V, w, v, c, dp);
  vType ret = inf;
  for(int i=0; i <= V; ++i){
    ret = opt(ret, dp[i]);
  }
  cout << ret << endl;
}
相关推荐
superman超哥4 分钟前
Rust 异步性能最佳实践:高并发场景的极致优化
开发语言·后端·rust·最佳实践·异步性能·高并发场景
汉克老师5 分钟前
GESP2025年12月认证C++二级真题与解析(编程题2 (黄金格))
c++·二维数组·gesp二级·gesp2级·分支判断
未来之窗软件服务6 分钟前
幽冥大陆(八十一)安检原理识别管制刀具原理go语言—东方仙盟练气期
开发语言·后端·golang·安检系统
Object~6 分钟前
1.golang项目结构
开发语言·后端·golang
ShineSpark7 分钟前
C++单例模式的演进:从经典实现到现代线程安全范式
c++·安全·单例模式
TDengine (老段)8 分钟前
TDengine GROUP BY 与 PARTITION BY 使用及区别深度分析
大数据·开发语言·数据库·物联网·时序数据库·tdengine·涛思数据
Object~9 分钟前
2.变量声明
开发语言·前端·javascript
良木生香12 分钟前
【数据结构-初阶】二叉树---链式存储
c语言·数据结构·c++·算法·蓝桥杯·深度优先
chian-ocean12 分钟前
网络世界的“搬运工”:深入理解数据链路层
开发语言·网络·php
weixin_lynhgworld14 分钟前
旧物回收小程序:让闲置物品焕发新生 ✨
java·开发语言·小程序