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

[题解]GDOI2014

洛谷题目传送门
这是一道很难简单的动态规划题

思路:

我们可以这么想因为单位时间内购买苦工的数量没有限制,所以我们把dp[i]设成单位时间内花费i资源购买苦工能取得的最大劳动力,所以dp[i]可以用完全背包求出,因为苦工可以重复买。

我们再设dpa[i][j]表示i单位时间后剩下j有资源能拥有的最大劳动力。
我们可以依次枚举时间i,拥有的劳动力j,以及在第i单位时间用于购买苦工的劳动力。
最后利用 dp[i]进行转移,当拥有的资源数到达或超过T时输出即可。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,t,a[105],b[105],dp[1005],dpa[1005][1005];
int main(){scanf("%d%d%d",&n,&m,&t);for(int i=1;i<=n;i++){scanf("%d%d",&a[i],&b[i]);}memset(dp,-1,sizeof(dp));memset(dpa,-1,sizeof(dpa));dp[0]=0;for(int i=1;i<=n;i++){for(int j=a[i];j<1000;j++){if(dp[j-a[i]]!=-1)dp[j]=max(dp[j],dp[j-a[i]]+b[i]);}}dpa[0][m]=0;for(int i=0;i<=1000;i++){if(dpa[i][t]!=-1){printf("%d",i);return 0;}for(int j=0;j<=t;j++){if(dpa[i][j]==-1)continue;for(int l=0;l<=j;l++){if(dp[l]==-1)continue;if(j-l+dp[l]+dpa[i][j]>=t){printf("%d",i+1);return 0;}dpa[i+1][j-l+dp[l]+dpa[i][j]]=max(dpa[i+1][j-l+dp[l]+dpa[i][j]],dpa[i][j]+dp[l]);}}}return 0;
}

题解比较垃圾,欢迎开喷

http://www.kefakeji.com/news/758.html

相关文章:

  • 从代码堆砌到工程思维:读《构建之法》的蜕变思考
  • 初遇框架
  • 2025/7/27 模拟赛总结
  • 扣子Coze智能体万字教程:从入门到精通,一文掌握AI工作流搭建
  • STM32简介 - LI,Yi
  • 数学相关学习笔记
  • 第二天
  • 【图论】总结 10:无向图的必经边与必经点
  • 准备去北京
  • 英国拟立法限制iOS与Android垄断地位,强制开放移动生态
  • vmware虚拟机安装
  • 通过Python交互式控制台理解Conv1d
  • 多Agent协作入门:群聊编排模式
  • nreset
  • 7月27号
  • 4
  • rapidocr v3.3.0发布了
  • 15. 三数之和
  • 20250727
  • JTAG和SWD的简单了解
  • 齐治堡垒机资深工程师认证通关
  • 7.26每周总结
  • 7.19每周总结
  • day24
  • docker安装与镜像打包部署
  • AirSim在UE4中运行时显示第一人称捕获图像窗口
  • ArKTS:List 数组
  • 笔记:割空间、环空间、切边等价
  • 15Java基础之内部类
  • 第四天