当前位置: 首页 > news >正文

洛谷P1510 精卫填海 题解

本题做法

  • 0-1 背包 DP。

思路

这题就是简单的 0-1 背包 DP 的小小变形而已。

我们可以定义 \(dp[i][j]\) 为前 \(i\) 个木石中剩余体力为 \(j\) 的最大填补体积。使用双重循环来递推 \(dp\)。若 \(j\ge m_i\),则 \(dp[i][j]=\max(dp[i-1][j],dp[i-1][j-m_i]+k_i)\);否则 \(dp[i][j]=dp[i-1][j]\)

全部计算完毕后,若 \(dp[n][c]<v\),则代表即使用光所有体力,也没法衔来足够体积的木石,则输出 Impossible;否则从 \(c\) 反向遍历到 \(0\),若首次出现 \(dp[n][i]<v\),则代表 \(dp[n][i+1]\ge v\),则剩余的体力就是 \(c-i-1\),输出 \(c-i-1\)

但是我写代码的时候认为 \(dp\) 开二维数组会爆内存(因为 \(1\le n\le 10^4\)),所以我用滚动数组优化了一下,此时第二层循环需要倒序循环,否则会覆盖上一个木石的数据。

代码

#include<bits/stdc++.h>typedef long long ll;
typedef unsigned long long ull;using namespace std;const int N=1e4+5;struct wood{ll v,w;
} w[N];ll n,m,c,dp[N];
//dp[i]表示在剩下i体力的时候int main(){cin>>m>>n>>c;for(int i=1;i<=n;i++) {cin>>w[i].w>>w[i].v;}for(int i=1;i<=n;i++) {for(int j=c;j>=0;j--) {if(j>=w[i].v) {dp[j]=max(dp[j],dp[j-w[i].v]+w[i].w);}}}if(dp[c]<m) cout<<"Impossible"<<endl;else{for(int i=c;i>=0;i--){if(dp[i]<m) {cout<<c-i-1<<endl;return 0;}}}return 0;
}
http://www.vanclimg.com/news/1526.html

相关文章:

  • 30
  • 25.7.29ds专题测试总结
  • 软工7.29
  • 在线卷积全解-从cdq分治到多叉与自迭代结构
  • ​iTrustSSL证书夏季大促,最高直降92.5%!
  • Ekoparty CTF 2024 赛题详解:从取证分析到密码破解的实战记录
  • 亚马逊机器人如何用多模态识别技术取代条形码
  • js获取多个div元素的方法。如果这些div有父子关系,如何进行区分?如何由子获得父?
  • django+Vue的项目使用docker打包
  • PyTorch 构建轻量级验证码识别模型
  • Hello CnBlogs
  • 从简历到入职:Moka稳定性雷达如何预测候选人留存率
  • [POI2012] Prefixuffix 题解
  • 7.29
  • 2025 -- 云智计划 -- 【CSP-S】模拟赛 #2_总结+题解
  • 使Excel高亮显示选中表格(使选中的表格更加突出)
  • 2、统计连续登录5天的用户
  • AMD纯NPU运行AI画图StableDiffusion3.0模型
  • C#自学笔记:委托与事件
  • 电流探头去磁与调零操作对测量精度的影响
  • 企业HR如何将AI Agent作为战略引擎重构业务流程
  • 7月29日总结
  • thradlocal
  • ThreadLocal线程隔离值为NULL,直接复制使用封装类
  • 基于 Nacos + Higress 的 MCP 开发新范式,手把手教程来了!
  • 使用Vue.js实现动态表单字段
  • 特征 - kkksc03
  • 7月29日
  • 图神经网络的未来与挑战
  • 网站SSL证书怎么选?不用SSL证书会怎么样?