c++语言 动态规划法实现对下面问题的求解 题目:某厂为扩大生产能力,拟订购某种成套4—6套,以分配给其所辖1、2、3个分厂使用。预计某个分厂分得不同套数的设备后,每年创造的利润(万元)如下表所示。该厂应订购几套设备并如何分配,才能使每年预计创利总额最大? 分厂 利润(万元) 0套 1套 2套 3套 4套 5套 6套 1 0 3 5 6 7 6 5 2 0 4 6 7 8 9 10 3 0 2 5 9 8 8 7
时间: 2024-01-01 17:04:38 浏览: 37
以下是使用C++语言实现上述问题的代码:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 3 + 1; // 分厂的个数
const int MAXK = 6 + 1; // 每个分厂可选的设备套数
const int profit[MAXN][MAXK] = { // 利润数组
{0, 3, 5, 6, 7, 6, 5},
{0, 4, 6, 7, 8, 9, 10},
{0, 2, 5, 9, 8, 8, 7},
{0, 0, 0, 0, 0, 0, 0} // 哨兵行,用于减少特判
};
int dp[MAXN][MAXK * MAXN]; // 状态数组,其中dp[i][j]表示前i个分厂中选择j套设备所能获得的最大利润
int main() {
memset(dp, 0, sizeof(dp)); // 初始化状态数组
for (int i = 1; i <= MAXN; i++) { // 枚举前i个分厂
for (int j = i; j <= i * MAXK; j++) { // 枚举选择j套设备
for (int k = 4; k <= 6; k++) { // 枚举当前分厂选择k套设备
if (j >= k) { // 如果选择的设备套数不超过j
dp[i][j] = max(dp[i][j], dp[i-1][j-k] + profit[i-1][k]); // 更新状态
}
}
}
}
int ans = 0; // 记录最大利润
for (int j = 1; j <= MAXK * MAXN; j++) { // 在dp[n][j]中取最大值,其中n表示分厂的个数
ans = max(ans, dp[MAXN-1][j]);
}
cout << "最大利润为:" << ans << "万元" << endl; // 输出结果
return 0;
}
```
注:由于题目中分厂的编号从1开始,而数组下标从0开始,因此在利润数组中使用i-1作为下标来表示第i个分厂的利润。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)