Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;使用最小硬币返回数组/向量以获得值动态规划_C++_Arrays_Vector_Dynamic Programming_Minimum - Fatal编程技术网

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