C++ :
使用动态规划 算法的函数
int knapsack(int W, int wt[], int val[], int n) { int dp[n+1][W+1]; //报错 for (int i = 0; i <= n; i++) { for (int w = 0; w <= W; w++) { if (i == 0 || w == 0) { dp[i][w] = 0; } else if (wt[i-1] <= w) { dp[i][w] = max(val[i-1] + dp[i-1][w-wt[i-1]], dp[i-1][w]); } else { dp[i][w] = dp[i-1][w]; } } } return dp[n][W]; }
上面在函数中创建由输入参数确定大小的二维数组,可以参考下面的代码修改:
要在 C++ 中创建一个由实参确定大小的二维数组,可以使用以下语法: void foo(int rows, int cols) { int** arr = new int*[rows]; for (int i = 0; i < rows; i++) { arr[i] = new int[cols]; } // 使用 arr for (int i = 0; i < rows; i++) { delete[] arr[i]; } delete[] arr; }
此代码将创建一个由实参 rows 和 cols 确定大小的二维数组。它使用 new 运算符分配一个包含 rows 个指针的数组,每个指针指向一个包含 cols 个 int 的数组。要释放动态分配的内存,可以使用 delete 运算符。要释放二维数组,可以使用以下语法:
for (int i = 0; i < rows; i++) { delete[] arr[i]; } delete[] arr;
此代码将释放 arr 指向的二维数组。请注意,必须使用 delete[] 运算符释放数组,而不是 delete 运算符。请注意,使用动态分配的二维数组可能会导致性能问题,因为它不是连续的内存块。如果您需要高性能的二维数组,可以考虑使用一维数组和索引计算来模拟二维数组。
完整代码如下:
#include <iostream> #define WeightLimit 12 //背包容量 #define num 10 //物品总数量 using namespace std;
int wt[num] = { 5,7,2,1,2,4,3,4,8,3 }; //各个物品重量 int val[num] = { 1,2,8,2,6,3,5,4,7,6 }; //各个物品价值
int knapsack(int W, int wt[], int val[], int n) { //创建动态二维数组: int** dp = new int* [n + 1]; for (int i = 0; i < n + 1; i++) { dp[i] = new int[W + 1]; } for (int i = 0; i <= n; i++) { for (int w = 0; w <= W; w++) { if (i == 0 || w == 0) { dp[i][w] = 0; } else if (wt[i - 1] <= w) { dp[i][w] = max(val[i - 1] + dp[i - 1][w - wt[i - 1]], dp[i - 1][w]); } else { dp[i][w] = dp[i - 1][w]; } //打印价值表: cout.width(3); cout << dp[i][w] << ' '; } cout << endl; } int ret = dp[n][W]; //删除动态二维数组: for (int i = 0; i < n + 1; i++) { delete[] dp[i]; } delete[] dp; return ret; } int main() { int maxvalue = knapsack(WeightLimit, wt, val, num); cout << "Max value is :" << maxvalue << endl; }
该程序对应的价值表:
标签:arr,背包,knapsack,--,int,二维,rows,数组,delete From: https://www.cnblogs.com/Huae/p/17234258.html