修改一下错误:#include <stdio.h> #include <stdlib.h> #define MAX_COINS 100 #define MAX_AMOUNT 10000 #define INF 0x3f3f3f3f int p[MAX_COINS]; int w[MAX_COINS]; int x[MAX_COINS]; int f[MAX_AMOUNT]; void dp(int n, int m) { for (int i = 1; i <= m; i++) { f[i] = INF; for (int j = 1; j <= n; j++) { if (i >= p[j]) { int tmp = f[i - p[j]] + w[j]; if (tmp < f[i]) { f[i] = tmp; x[j] = i - p[j]; } } } } } int main() { int n, m; printf("请输入硬币种类数n和要找的钱数m:"); scanf("%d%d", &n, &m); printf("请输入%d种硬币的面值p和重量w:\n", n); for (int i = 1; i <= n; i++) { scanf("%d%d", &p[i], &w[i]); } dp(n, m); printf("找零钱方案如下:\n"); int j = n; while (m > 0) { if (x[j] <= m && m < x[j] + p[j]) { printf("用面值为%d的硬币%d枚\n", p[j], (m - x[j]) / p[j]); m = x[j]; } else { j--; } } printf("所找硬币的最轻总重量为%d\n", f[m]); return 0; }
时间: 2024-01-14 15:02:12 浏览: 77
修改后的代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_COINS 100
#define MAX_AMOUNT 10000
#define INF 0x3f3f3f3f
int p[MAX_COINS];
int w[MAX_COINS];
int x[MAX_COINS];
int f[MAX_AMOUNT];
void dp(int n, int m) {
for (int i = 1; i <= m; i++) {
f[i] = INF;
for (int j = 1; j <= n; j++) {
if (i >= p[j]) {
int tmp = f[i - p[j]] + w[j];
if (tmp < f[i]) {
f[i] = tmp;
x[i] = j; // 修改这里,应该是 x[i] 而不是 x[j]
}
}
}
}
}
int main() {
int n, m;
printf("请输入硬币种类数n和要找的钱数m:");
scanf("%d%d", &n, &m);
printf("请输入%d种硬币的面值p和重量w:\n", n);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &p[i], &w[i]);
}
dp(n, m);
printf("找零钱方案如下:\n");
while (m > 0) {
int j = x[m];
printf("用面值为%d的硬币%d枚\n", p[j], (m - p[j]) / p[j]);
m -= p[j];
}
printf("所找硬币的最轻总重量为%d\n", f[m]);
return 0;
}
```
主要修改了以下几点:
1. 在 `dp` 函数中,将 `x[j]` 改成了 `x[i]`,因为 `x` 数组存储的是第 `i` 个硬币需要的最小金额,而不是第 `j` 个硬币。这个错误会导致输出结果不正确。
2. 在 `main` 函数中,将找零钱的循环改成了一个 `while` 循环,并且将变量 `j` 的初始化移到循环内部,这样代码更加简洁。同时,在输出找零钱方案时,将 `(m - x[j]) / p[j]` 改成了 `(m - p[j]) / p[j]`,这样输出的硬币数量才是正确的。
3. 其他没有修改的地方,主要是格式和注释。
阅读全文