有两艘船,载重量分别是 c1、 c2,n 个集装箱,重量是 wi (i=1…n),且所 有集装箱的总重量不超过 c1+c2。确定是否有可能将所有集装箱全部装入两艘船。 输入:多个测例,每个测例的输入占两行。第一行一次是 c1、c2 和 n(n<=10);第 二行 n 个整数表示 wi (i=1…n)。n 等于 0 标志输入结束。 输出:对于每个测例在单独的一行内输出 Yes 或 No,在给出判断结果的同时,也输出哪个集装箱被放在了哪个船上。用c语言书写,并给注释
时间: 2024-03-19 10:45:56 浏览: 146
装载问题有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船
5星 · 资源好评率100%
以下是该问题的 C 语言代码实现,包括输入、判断和输出,并附有注释。
```c
#include <stdio.h>
#define MAX_N 10 // 定义最大集装箱数量
int main() {
int c1, c2, n, w[MAX_N], i, j, k, flag;
while (1) { // 外层循环,读取多个测例
scanf("%d%d%d", &c1, &c2, &n); // 读入船的载重量和集装箱数量
if (n == 0) break; // 集装箱数量为 0,结束程序
for (i = 0; i < n; i++) { // 读入每个集装箱的重量
scanf("%d", &w[i]);
}
flag = 0; // 初始化标志位为 0,表示无法装载完成
for (i = 0; i < (1 << n); i++) { // 枚举所有情况
int sum1 = 0, sum2 = 0; // 初始化两艘船的重量为 0
for (j = 0; j < n; j++) { // 判断船装载情况
if ((i >> j) & 1) { // 如果第 j 个集装箱装在船 1 上
sum1 += w[j]; // 将第 j 个集装箱的重量加到船 1 上
} else { // 否则第 j 个集装箱装在船 2 上
sum2 += w[j]; // 将第 j 个集装箱的重量加到船 2 上
}
}
if (sum1 <= c1 && sum2 <= c2) { // 如果能装载完成
printf("Yes\n"); // 输出 Yes
for (k = 0; k < n; k++) { // 输出每个集装箱的装载情况
if ((i >> k) & 1) { // 如果第 k 个集装箱装在船 1 上
printf("%d ", k + 1); // 输出集装箱编号
printf("on ship1\n"); // 输出装载情况
} else { // 否则第 k 个集装箱装在船 2 上
printf("%d ", k + 1); // 输出集装箱编号
printf("on ship2\n"); // 输出装载情况
}
}
flag = 1; // 标志位设为 1,表示能装载完成
break; // 跳出循环
}
}
if (!flag) { // 如果无法装载完成
printf("No\n"); // 输出 No
}
}
return 0; // 程序结束
}
```
该程序的思路是先读入船的载重量和集装箱重量,然后采用位运算的方式来枚举所有情况,判断能否将所有集装箱全部装入两艘船中,最后输出结果。
阅读全文