今年夏天

从高考的奋战到大学生活的自我激励,作者回顾了过去一年的成长经历,并展望未来充满挑战的社会生活。

 不知不觉已步入夏天,还记得去年夏天这个时候我们在集中精力为高考的战斗中挥汗,汗水顺着脸颊而下的 感觉到现在还是那么清晰留恋,不曾奋斗哪来收获。。。。

  现在又是夏天,只是有了些许的改变,我,已经不是在高考而努力,为的是今后的生活充实在加油!现在也没有老师在旁边苦口婆心地唠叨,也没有同学会为你的不开心而一起逃课,没有谁会盯着你学习,一切靠自己,命运靠自己主宰。。。看到学姐学长一个一个走向缤纷而复杂的社会,只为找一份好工作东奔西跑,即使撞了一鼻子灰也必须昂起头大胆地往前走,油然而生的是敬畏,也是担心,敬畏他们的生生不息,担心我们的似锦前程。。。

   最好的 时间是现在,最简短的 答案是行动!go !ahead!super mouse!together!

### 问题描述重述 我们需要将n个人分成若干批过桥,每批人的总重量不能超过W。目标是找到最少需要分成多少批,使得所有人都能安全过桥。 ### 解题思路 这是一个典型的分组问题,可以使用**贪心算法**或**动态规划**来解决。由于n的范围较小(n <= 18),我们可以使用**状态压缩动态规划**来高效地解决这个问题。 #### 状态压缩动态规划思路: 1. **状态表示**:用一个整数mask的二进制位表示哪些人已经被分组(1表示已分组,0表示未分组)。 2. **状态转移**:对于当前未被分组的人,尝试将他们分成新的一组,条件是这组的总重量不超过W。 3. **DP数组**:`dp[mask]`表示分组状态为mask时所需的最少批次。 4. **初始状态**:`dp[0] = 0`,表示没有人被分组时批次为0。 5. **转移方程**:对于每个状态mask,遍历所有未被分组的人,尝试将他们分成一组,并更新新的状态`new_mask`的批次数。 ### C++代码实现 ```cpp #include <iostream> #include <vector> #include <algorithm> #include <climits> using namespace std; int main() { freopen("bridge.in", "r", stdin); freopen("bridge.out", "w", stdout); int n, W; cin >> n >> W; vector<int> w(n); for (int i = 0; i < n; ++i) { cin >> w[i]; } // DP数组,初始化为无穷大 vector<int> dp(1 << n, INT_MAX); dp[0] = 0; // 初始状态:0批次 for (int mask = 0; mask < (1 << n); ++mask) { if (dp[mask] == INT_MAX) continue; // 跳过不可达状态 int remaining = ((1 << n) - 1) ^ mask; // 未分组的人 for (int subset = remaining; subset; subset = (subset - 1) & remaining) { int sum = 0; for (int i = 0; i < n; ++i) { if (subset & (1 << i)) { sum += w[i]; } } if (sum <= W) { int new_mask = mask | subset; dp[new_mask] = min(dp[new_mask], dp[mask] + 1); } } } cout << dp[(1 << n) - 1] << endl; return 0; } ``` ### 代码解释 1. **输入处理**:从文件中读取n和W,以及每个人的体重。 2. **DP数组初始化**:`dp`数组大小为`2^n`,初始值为`INT_MAX`,表示不可达状态。`dp[0] = 0`表示初始状态(无人分组)需要0批次。 3. **状态转移**: - 遍历所有可能的状态mask。 - 对于每个mask,找到所有未被分组的人(remaining)。 - 尝试所有可能的子集subset,计算子集的重量和。 - 如果子集重量和不超过W,则更新新状态`new_mask`的批次数。 4. **输出结果**:最终状态`(1 << n) - 1`表示所有人都已分组,输出对应的批次数。 ### 示例输入输出 对于输入样例: ``` 4 10 5 6 3 7 ``` 程序会输出: ``` 3 ``` 解释:可以分成[5,3], [6], [7],共3批。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值