解题思路:
注意事项: 不要被题目骗了,数组要开大一点,样例输出也是错的,服了这题目!
参考代码:
#include"bits/stdc++.h" using namespace std; // 定义全局变量m和n,分别表示背包容量和物品数量 int m, n; // 定义三个数组wi、ci和pi,分别存储每个物品的重量、价值和最大数量 int wi[400], ci[400], pi[400]; // 定义数组f,用于动态规划记录不同容量下的最大价值 int f[2100]; int main() { // 输入背包容量m和物品数量n cin >> m >> n; // 输入每个物品的重量、价值和最大数量 for (int i = 1; i <= n; i++) { cin >> wi[i] >> ci[i] >> pi[i]; } // 定义变量s,用于计算当前物品可以选择的最大数量 int s; // 遍历每一个物品 for (int i = 1; i <= n; i++) { // 从背包容量m开始向下遍历到1 for (int j = m; j >= 1; j--) { // 如果当前物品没有数量限制,则可以选择j/wi[i]个该物品 if (pi[i] == 0) { s = j / wi[i]; } else { // 否则选择j/wi[i]和pi[i]中的最小值 s = min(j / wi[i], pi[i]); } // 遍历当前物品可以选择的数量k for (int k = 1; k <= s; k++) { // 更新动态规划数组f,取当前值和加入k个当前物品后的值的较大者 f[j] = max(f[j], f[j - k * wi[i]] + k * ci[i]); } } } // 输出背包容量为m时的最大价值 cout << f[m] << endl; return 0; }
0.0分
0 人评分
数组输出 (C语言代码)--此题的题目描述有问题浏览:1844 |
三角形 (C++代码)递归(存在大量重复计算,容易出现时间超限)浏览:836 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:268 |
DNA (C语言描述,蓝桥杯)浏览:1653 |
关于C语言变量位置的问题浏览:294 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:729 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:1496 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:455 |
计算表达式浏览:693 |
Manchester- A+B for Input-Output Practice (VII)浏览:1045 |