用c语言写一个动态规划法求解分饼干问题
时间: 2024-03-09 09:49:03 浏览: 66
好的,下面是用C语言实现的分饼干问题的动态规划算法:
```
#include <stdio.h>
#include <stdlib.h>
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
int n, m;
printf("请输入小朋友的数量和饼干数量:\n");
scanf("%d %d", &n, &m);
int children[n], i;
printf("请输入每个小朋友的胃口值:\n");
for (i = 0; i < n; i++) {
scanf("%d", &children[i]);
}
int dp[n+1][m+1];
for (i = 0; i <= n; i++) {
dp[i][0] = 0; // 饼干数量为0时,无法满足任何小朋友的胃口
}
for (i = 0; i <= m; i++) {
dp[0][i] = 0; // 没有小朋友时,无法发放任何饼干
}
for (i = 1; i <= n; i++) {
int j;
for (j = 1; j <= m; j++) {
if (children[i-1] <= j) { // 如果当前饼干数量能够满足当前小朋友的胃口值
dp[i][j] = max(dp[i-1][j], dp[i-1][j-children[i-1]] + 1); // 贪心决策:发放或不发放当前饼干
} else {
dp[i][j] = dp[i-1][j]; // 当前饼干数量无法满足当前小朋友的胃口值,不发放当前饼干
}
}
}
printf("最多可以满足 %d 个小朋友的胃口。\n", dp[n][m]);
return 0;
}
```
代码的思路是用一个二维数组`dp[i][j]`表示前`i`个小朋友和前`j`个饼干能够满足的最大小朋友数量。初始化`dp[0][j] = 0`和`dp[i][0] = 0`。然后对于第`i`个小朋友和第`j`个饼干,如果当前饼干数量能够满足当前小朋友的胃口值,则贪心决策:发放或不发放当前饼干,即`dp[i][j] = max(dp[i-1][j], dp[i-1][j-children[i-1]] + 1)`;否则不发放当前饼干,即`dp[i][j] = dp[i-1][j]`。最终输出`dp[n][m]`即可。
阅读全文