Oh,AC! 2024-11-13 21:39 采纳率: 91.7%
浏览 12
已结题

关于c++ 动态规划 的问题

我遇到了一个c++代码问题。无论我输入什么数据,代码的输出始终是-1,而我希望它能正确地输出凑齐给定金额所需的最少硬币数量。

我已经检查了以下方面:

一、我确保输入数据的格式是正确的,硬币面值数组和目标金额都是按照要求输入的。

二、我检查了动态规划数组的初始化,确保dp数组的所有元素都被初始化为INT_MAX,除了dp[0]被初始化为0。

三、我检查了动态规划的逻辑,确保在更新dp数组时,是按照正确的顺序和条件进行的。

四、我尝试使用简单的测试用例来运行代码,但是仍然得到-1作为输出。

五、我检查了编译器和环境设置,确认它们没有问题。

六、我添加了调试输出,但是仍然无法找出问题的根源。

题目描述:

我们有n种不同的硬币,这些硬币的面值分别是v1, v2, ..., vn。每种硬币都有无限多个可以使用。现在给定一个非负整数S,我们的目标是选择尽可能少的硬币,使得它们的面值之和恰好等于S。

要求输出满足条件的最少硬币数量。如果无法凑出金额S,则输出-1。

输入格式如下:

首先,输入的第一行包含两个整数n和S,分别表示硬币的种类数和目标金额。

接下来,输入的第二行包含n个整数,这些整数表示每种硬币的面值v1, v2, ..., vn。

输出格式如下:

输出一个整数,表示凑出金额S所需的最少硬币数量。如果无法凑出金额S,则输出-1。

以下是一个输入样例:

6 666
1 5 10 20 50 100

对应的输出样例为:

10

数据规模如下:

对于所有的数据,硬币的种类数n满足1 ≤ n ≤ 100,目标金额S满足0 ≤ S ≤ 100000。

我的代码:

#include <bits/stdc++.h>
using namespace std;
int dp[100005],v[105];
int main()
{
    int n,s;
    cin >> n >> s;
    for(int i=0;i<n;i++)
    {
        cin >> v[i];
    }
    memset(dp,INT_MAX,sizeof(dp));
    dp[0]=0;
    for(int i=0;i<n;i++)
    {
            for(int j=v[i];j<=s;j++)
            {
                dp[j]=min(dp[j],dp[j-v[i]]+1);
            }
    }
    cout<<(dp[s]==INT_MAX?-1:dp[s]);
    return 0;
} 

  • 写回答

1条回答 默认 最新

  • 想要AC的dly 2024-11-13 22:59
    关注

    ok你是我见过描述问题最详细的了,我也简单说说我发现的问题,点个采纳叭

    img

    img


    越界的样例如下:

    img

    img

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月22日
  • 已采纳回答 11月14日
  • 创建了问题 11月13日