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;
}
相关推荐
YouEmbedded2 小时前
解码继承——代码复用与层次化设计
开发语言·c++·继承
有点。2 小时前
C++ ⼀级 2023 年 12 ⽉
c++
这是个栗子2 小时前
【JS知识点总结】JavaScript 中的精确取整:Math.floor、Math.ceil 与 Math.round
开发语言·javascript·ecmascript
FMRbpm2 小时前
顺序表实现队列
数据结构·c++·算法·新手入门
飞天狗1112 小时前
G. Mukhammadali and the Smooth Array
数据结构·c++·算法
红石程序员2 小时前
Python环境管理
开发语言·python
Chennnng2 小时前
关于python版本,显卡版本,torch版本之间的问题
开发语言·python
rit84324992 小时前
基于MATLAB的多变量动态矩阵控制(DMC)仿真实现
开发语言·matlab·矩阵
罗湖老棍子2 小时前
Knight Moves(信息学奥赛一本通- P1257)
c++·算法·bfs