动态规划例子 -- 背包问题 knapsack

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; }

 该程序对应的价值表:

 

posted @ 2023-03-19 21:44  星云体  阅读(54)  评论(0编辑  收藏  举报