#include<stdio.h> int dp[1000001]={1000001}; int coins[3]={1,5,11}; int main() { int n,coin; scanf("%d",&n); dp[0]=0; for(int i=0;i<n;i++) { for(int j=0;j<3;j++) { coin=coins[j]; if(i-coin<0) continue; } if(dp[i]<(1+dp[i-coin])) dp[i]=dp[i]; else dp[i]=1+dp[i-coin]; } return(dp[n]==n+1)?-1:dp[n]; }
时间: 2024-01-02 22:05:22 浏览: 79
这是一个使用动态规划解决找零钱问题的代码,但是有一些错误。
首先,在定义 dp 数组时,应该初始化为最大值,而不是只初始化第一个元素为最大值。可以改为:
```c
int dp[1000001];
for(int i = 0; i <= n; i++){
dp[i] = 1000001;
}
```
其次,在第二个 for 循环中,应该将花费硬币的操作放在循环内部,而不是循环外部。可以改为:
```c
for(int j=0;j<3;j++) {
coin=coins[j];
if(i-coin>=0) {
if(dp[i]<(1+dp[i-coin]))
dp[i]=dp[i];
else
dp[i]=1+dp[i-coin];
}
}
```
最后,在返回结果时,应该判断 dp[n] 是否等于初始值,而不是 n+1,因为当 n=0 时,n+1 会等于 1,而 dp[0] 初始值为 0。可以改为:
```c
return (dp[n]==1000001)?-1:dp[n];
```
修改后的完整代码如下:
```c
#include<stdio.h>
int dp[1000001];
int coins[3]={1,5,11};
int main() {
int n, coin;
scanf("%d",&n);
for(int i = 0; i <= n; i++){
dp[i] = 1000001;
}
dp[0]=0;
for(int i=1;i<=n;i++) {
for(int j=0;j<3;j++) {
coin=coins[j];
if(i-coin>=0) {
if(dp[i]<(1+dp[i-coin]))
dp[i]=dp[i];
else
dp[i]=1+dp[i-coin];
}
}
}
return (dp[n]==1000001)?-1:dp[n];
}
```
阅读全文