首页 > 其他分享 >动态规划例子 -- 背包问题 knapsack

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

时间:2023-03-19 21:59:00浏览次数:36  
标签:arr 背包 knapsack -- int 二维 rows 数组 delete

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

相关文章

  • jQuery
    jQuery语法1、引用声明:<scriptsrc="jQuery文件URL"type="text/javascript"charset="UTF-8"></script>2、基础语法结构:jQuery的美元符号$是jQuery的简写文档就绪......
  • 你讲讲分布式事务问题的几种方案?
    分布式事务的实现主要有以下5种方案:XA方案TCC方案本地消息表可靠消息最终一致性方案最大努力通知方案两阶段提交方案/XA方案所谓的XA方案,即:两阶段提交,有......
  • 【单元测试】Junit 4(七)--junit4 TestRunnner
    TestRunners我没想到一个特别合适的词来形容TestRunners的作用,所以多说几句:TestRunners是具有特殊功能的执行测试用例的通道,也可以理解为测试的执行者,例如可以同时运......
  • fastadmin 自定义build_toolbar按钮
    fastadmin自定义build_toolbar按钮何渊渊于2020-09-2311:13:31发布1930收藏4分类专栏:fastadmin文章文章标签:javascriptphp版权fastadmin同时被2个专栏收......
  • 第四周周报
    第四周周报(2023/3/13-2023/3/19)本周总结本周完成的主要内容是哈希专题题单以及蓝桥杯真题日程描述3.13:补abc293和NebiusWelcomeRound的题目3.14:蓝桥杯真题3.......
  • 【VTK学习笔记】VTK基本数据结构_3.2数据对象和数据集
    任务:把几何结构和拓扑结构加入到数据集中1.无拓扑结构1#include<vtkSmartPointer.h>2#include<vtkPoints.h>//几何结构3#include<vtkPolyData.h>//数据集......
  • GnuRadio-常见模块
    1、信号波形生成器(WaveformGenerators)(1)常数信源(ConstantSource)(2)噪声信源(NoiseSource)(3)信号源(SignalSource)例如正弦信号、方波信号等2、调制器(Modulators)(1)AM解调(AMDemo......
  • test
    暂无TRANSLATEwithxEnglishArabicHebrewPolishBulgarianHindiPortugueseCatalanHmongDawRomanianChineseSimplifiedHungarianRussian......
  • 保龄球计分程序
        计算每轮单独得分,十轮累加得总分。每轮单独得分,按规则可以大致总结出,如果议论中首次全中或者两次补中,则相当于第一次滚球后连续加后面两次;否则,只加后面一次。......
  • CF855 Div3 VP 游记
    比赛链接好长时间不写博文了甚至快忘记了(今天水一发Div3游记,在Div4比赛之前。第一次VP,当然得选一个简单点的了,打了50分钟多一点。排名不错,400多。$T1$:开始时......