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;
}
相关推荐
Chester_19993 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
EXI-小洲4 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
会周易的程序员5 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导5 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan5 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
小灰灰搞电子5 小时前
完全驾驭 Qt 与数据库:C++ ORM 框架 QxOrm 原理与实践指南
数据库·c++·qt
QT界面美化性能优化5 小时前
QT+AI:使用AI技术为QT应用程序赋能
c++·人工智能·qt·opencv·qt教程·qt6.3
m0_695251495 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
大衛說6 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
学习星球7 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode