我遇到了一个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;
}




