C++ C++;使用最小硬币返回数组/向量以获得值动态规划
我的任务是创建一个函数,该函数接收硬币数组/向量和要达到的值。函数必须返回一个数组/向量,该数组/向量基本上包含每个面额应使用多少硬币的信息,以便使用最少数量的硬币,而不是简单地返回所需的最小硬币数 例如,数组C++ C++;使用最小硬币返回数组/向量以获得值动态规划,c++,arrays,vector,dynamic-programming,minimum,C++,Arrays,Vector,Dynamic Programming,Minimum,我的任务是创建一个函数,该函数接收硬币数组/向量和要达到的值。函数必须返回一个数组/向量,该数组/向量基本上包含每个面额应使用多少硬币的信息,以便使用最少数量的硬币,而不是简单地返回所需的最小硬币数 例如,数组硬币容纳[1,2,5,10],所需值为12美分。该函数应将所有这些都输入并返回一个数组,其中包含以下数字:[0,1,0,1],表示应使用01分硬币,12分硬币,应使用05分硬币,应使用110分硬币 我使用C++,必须使用一个动态编程算法,我能做的就是返回最小的硬币数量。但是,我不知道如何生
硬币
容纳[1,2,5,10]
,所需值为12美分。该函数应将所有这些都输入并返回一个数组,其中包含以下数字:[0,1,0,1]
,表示应使用0
1分硬币,1
2分硬币,应使用0
5分硬币,应使用1
10分硬币
<>我使用C++,必须使用一个动态编程算法,我能做的就是返回最小的硬币数量。但是,我不知道如何生成正确的数字来填充要返回的数组或向量
这就是我目前拥有的:
int *minCoins(int coins[], int size, int value)
{
int *table = new int[value + 1];
table[0] = 0;
for (int i = 1; i <= value; i++)
table[i] = INT_MAX;
for (int i = 1; i <= value; i++)
{
for (int j = 0; j < size; j++)
if (coins[j] <= i)
{
int sub_res = table[i - coins[j]];
if (sub_res != INT_MAX && sub_res + 1 < table[i])
table[i] = sub_res + 1;
}
}
//this is where I am unsure of what to do. should I return table or modify coins somehow?
}
int*minCoins(int coins[],int大小,int值)
{
int*表=新int[值+1];
表[0]=0;
对于(int i=1;i你可以使用pairdp[i][j],其中i是1对i索引的值j的答案,那么如果我们使用第i个硬币,那么dp[i][j]。second=true否则false,那么当你达到最小答案时,你可以使用递归函数,对于你达到的每个dp[i][j],如果bool为true,你必须到dp[i-1][j-a[i]]并加上i来回答(a是硬币的价值),否则你必须不做任何事情就去dp[i-1][j]
dp更新:
if(dp[i - 1][j].first < dp[i - 1][j - a[i]].first + 1)
{
dp[i][j].second = false;
dp[i][j].first = dp[i - 1][j].first;
}
else
{
dp[i][j].second = true;
dp[i][j].first = dp[i - 1][j - a[i]].first + 1;
}
我们可以额外存储最后一种硬币类型last[i]
,用于获取table[i]
。之后,我们可以执行i-=coins[last[i]]
循环获取所有硬币,直到i
变为零
代码:
int *minCoins(int coins[], int size, int value)
{
int *last = new int[value + 1]; // this line added
int *table = new int[value + 1];
table[0] = 0;
for (int i = 1; i <= value; i++)
table[i] = INT_MAX;
for (int i = 1; i <= value; i++)
{
for (int j = 0; j < size; j++)
if (coins[j] <= i)
{
int sub_res = table[i - coins[j]];
if (sub_res != INT_MAX && sub_res + 1 < table[i])
{
table[i] = sub_res + 1;
last[i] = j; // this line added
}
}
}
int *res = new int[size]; // this will be the answer
for (int i = 0; i < size; i++)
res[i] = 0;
int cur = value; // the value left
while (cur > 0)
{
res[last[cur]] += 1; // add the current coin
cur -= coins[last[cur]]; // proceed to the next coin
}
delete[] table;
delete[] last;
return res;
}
int*minCoins(int coins[],int大小,int值)
{
int*last=new int[value+1];//添加了此行
int*表=新int[值+1];
表[0]=0;
对于(int i=1;我使用std::vector
来表示硬币和返回类型。@Slava对不起,我对我的问题还不够清楚。我编辑了我的问题,希望能更清楚。不是我是否要使用数组或向量,我不知道如何生成正确的数字。然后你需要显示你的effort和你被困在哪里。目前,你似乎在要求别人编写你的代码。@J.Einhorn:正如Slava所指出的,你需要展示你的尝试,以便人们能够看到你目前被困的代码是什么样子,并提出具体建议。就目前而言,这只是一个简单的问题“请帮我做作业”-这类问题。我能告诉你从int*table=new int[value+1];
到std::vector table(value+1);
?它更安全,更容易使用。好吧,这对我来说很有意义!但是,last
在执行last[I]=coins[j]之前需要创建一个数组或向量
。但我明白你的意思,我认为,new[]创建的内容必须通过delete[]销毁
但是最好使用std::vector
非常感谢!这非常有效,我理解last
和res
是如何工作的。@Slava谢谢,修复了。我在从头开始写的时候也会使用std::vector
,但另一方面,我希望尽可能保留风格,专注于算法而不是程序明。
int *minCoins(int coins[], int size, int value)
{
int *last = new int[value + 1]; // this line added
int *table = new int[value + 1];
table[0] = 0;
for (int i = 1; i <= value; i++)
table[i] = INT_MAX;
for (int i = 1; i <= value; i++)
{
for (int j = 0; j < size; j++)
if (coins[j] <= i)
{
int sub_res = table[i - coins[j]];
if (sub_res != INT_MAX && sub_res + 1 < table[i])
{
table[i] = sub_res + 1;
last[i] = j; // this line added
}
}
}
int *res = new int[size]; // this will be the answer
for (int i = 0; i < size; i++)
res[i] = 0;
int cur = value; // the value left
while (cur > 0)
{
res[last[cur]] += 1; // add the current coin
cur -= coins[last[cur]]; // proceed to the next coin
}
delete[] table;
delete[] last;
return res;
}