【发布时间】:2020-06-27 10:31:28
【问题描述】:
我正在做硬币兑换问题,我正在尝试使用动态编程来做。但是我得到了这个我不太明白的汇编。有人告诉我,我必须动态分配“dp”数组,但他不知道为什么。请解释一下这个概念。
#include<bits/stdc++.h>
using namespace std;
int solve(int *d, int size, int n , int ** dp){
if(n==0)
return 1;
if(n<0)
return 0;
if(size == 0)
return 0;
if(dp[n][size]>-1)
return dp[n][size];
int x = solve(d,size,n-d[0],dp);
int y = solve(d+1, size - 1, n, dp );
dp[n][size] = x+y;
return x+y;
}
int countWaysToMakeChange(int denominations[], int numDenominations, int value){
int dp[value+1][numDenominations+1];
memset(dp, -1, sizeof dp);
return solve(denominations, numDenominations, value, dp );
}
错误:
Compilation Failed
In file included from Runner.cpp:3:0:
Solution.h: In function 'int countWaysToMakeChange(int*, int, int)':
Solution.h:28:60: error: cannot convert 'int (*)[(numDenominations + 1)]' to 'int**' for argument '4' to 'int solve(int*, int, int, int**)'
return solve(denominations, numDenominations, value, dp);
^
这是我的主文件代码:
#include<iostream>
using namespace std;
#include "Solution.h"
int main(){
int numDenominations;
cin >> numDenominations;
int* denominations = new int[numDenominations];
for(int i = 0; i < numDenominations; i++){
cin >> denominations[i];
}
int value;
cin >> value;
cout << countWaysToMakeChange(denominations, numDenominations, value);
}
【问题讨论】:
-
在 countWaysToMakeChange 中,var dp 是
int的二维数组,而不是指向 int 的指针数组(例如int**) .另请注意,在 solve 中,dp[n][size]的形式可能无法达到您的预期 -
其中不使用可变长度数组(
int dp[value+1][numDenominations+1];),并且 d 内容未在 solve 中使用,因此您读取的值在 main 中初始化 denominations 不相关
标签: c++ recursion dynamic-programming dynamic-memory-allocation