我创建了以下代码来查找硬币问题的答案。这涉及到找到给定k个面额的硬币的最小数量(其中每个这样的硬币无限供应(以形成目标和n。特别地,我研究了k=5
,面额={2,3,4,5,6}
和目标和n=100
的情况。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int coins[5] = {2,3,4,5,6};
int values[101];
int n=100;
int k=5;
int INF = INT_MAX;
int main()
{
for (int x=1;x<=n;x++)
{
values[x] = INF;
for (int j=1;j<=k;j++)
{
if (x-coins[j-1]>=0)
{
values[x] = min(values[x],values[x-coins[j-1]]+1);
}
}
}
cout<<values[100];
return 0;
}
我收到的这个代码的输出是-2147483632
。很明显,一定发生了某种溢出,所以我决定输出INF+1
。我得到了INT_MIN
作为答案。但我也记得,当输出一些超出int范围的数字时,通常不会出现这样的问题。
我决定输出1e11
,令我惊讶的是,答案仍然是1e11
。为什么会发生这种情况,请帮忙。
此处:
values[x] = min(values[x],values[x-coins[j-1]]+1);
例如,对于x=3
和coins[0]=2
,可以添加values[1] + 1
。
然而,values[1] = INT_MAX
。然后,在执行此计算时会得到一个未定义的行为。
您可以使用INF = INT_MAX - 1;
解决问题
如果您的程序对有符号整数执行算术运算,产生的结果超出了可表示值的范围,即如果此类运算溢出,例如在INT_MAX + 1
的情况下,则程序的行为是未定义的。
我决定输出1e11,令我惊讶的是,答案仍然是1e11。
1e11是一个浮点文字。浮点类型具有与int不同的可表示值范围,以及关于溢出的不同要求。