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;
}
相关推荐
端平入洛17 小时前
delete又未完全delete
c++
端平入洛2 天前
auto有时不auto
c++
郑州光合科技余经理3 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1233 天前
matlab画图工具
开发语言·matlab
dustcell.3 天前
haproxy七层代理
java·开发语言·前端
norlan_jame3 天前
C-PHY与D-PHY差异
c语言·开发语言
哇哈哈20213 天前
信号量和信号
linux·c++
多恩Stone3 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054963 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
遥遥江上月3 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js