HJ41.称砝码 C语言 动态规划
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
#include <stdio.h>
#include <stdbool.h>
int countWeights(int m[], int x[], int n) {
int totalWeight = 0;
for (int i = 0; i < n; i++) {
totalWeight += m[i] * x[i];
}
bool dp[n + 1][totalWeight + 1];
// 初始化,00为ture,其余元素为false
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= totalWeight; j++) {
dp[i][j] = false;
}
}
dp[0][0] = true;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= totalWeight; j++) {
dp[i][j] = dp[i - 1][j];
for (int k = 1; k <= x[i - 1] && j - k * m[i - 1] >= 0; k++) {
if (dp[i - 1][j - k * m[i - 1]]) {
dp[i][j] = true;
// printf("%d %d true\n", i, j);
break;
}
}
}
}
int count = 1; // 初始值设为1,包含重量0
for (int j = 1; j <= totalWeight; j++) {
if (dp[n][j]) {
count++;
}
}
return count;
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int m[n], x[n];
for (int i = 0; i < n; i++) {
scanf("%d", &m[i]);
}
for (int i = 0; i < n; i++) {
scanf("%d", &x[i]);
}
int result = countWeights(m, x, n);
printf("%d\n", result);
}
return 0;
}
查看21道真题和解析