古董装载优化:30秒破解重量限制
古董装载问题,计算在给定总重量限制下最多能装载多少件古董。
完整代码
#include <iostream>
using namespace std;
#include <algorithm>
const int N = 10005;
double w[N];int solve1(int n, double W)
{double tmp = 0.0;int ans = 0;for (int i = 0 ; i < n ; i++){tmp += w[i];if (tmp <= W){ans++;}else{break;}}return ans;
}int main()
{int n = 8;double W = 30.0;cout << "依次输入 " << n << " 件古董重量:" << endl;;for (int i = 0 ; i < n ; i++){cin >> w[i];}sort(w,w+n);cout << "可装载数量:";cout << solve1(n, W) << endl;system("pause");return 0;
}
代码结构说明
全局变量定义
w[N]
存储古董重量,N
是数组最大容量,W
是总重量限制。核心函数
solve1
通过遍历排序后的数组,累加重量并统计不超过W
的古董数量。tmp
记录当前累加重量。ans
记录合法装载数量。- 当累加值超过
W
时终止循环。
主函数
main
- 初始化古董数量
n=8
和总重量限制W=30.0
。 - 输入古董重量并存储到数组
w
。 - 调用
sort
对重量升序排序以优先装载轻的古董。 - 输出
solve1
的计算结果。
- 初始化古董数量
改进建议
输入验证
添加对输入重量非负的检查,避免无效数据:for (int i = 0; i < n; i++) {cin >> w[i];if (w[i] < 0) {cout << "重量不能为负!" << endl;return -1;} }
动态内存分配
使用vector
替代固定数组,避免溢出风险:vector<double> w(n);
输出优化
在排序后输出古董重量顺序,便于调试:sort(w.begin(), w.end()); cout << "排序后重量:"; for (auto x : w) cout << x << " "; cout << endl;
函数复用性
将solve1
改为通用函数,接受任意容器:template<typename Container> int solve1(const Container& weights, double max_weight) {double tmp = 0.0;int ans = 0;for (auto w : weights) {tmp += w;if (tmp <= max_weight) ans++;else break;}return ans; }
示例输入输出
输入:
3.5 7.2 4.1 10.0 2.8 5.3 6.7 1.9
排序后重量:
1.9 2.8 3.5 4.1 5.3 6.7 7.2 10.0
输出:
可装载数量:5
(累加 1.9+2.8+3.5+4.1+5.3=17.6 ≤ 30.0,第6件6.7会超限)