1926 小书童

这篇文章讲述了小A如何在有限时间内通过优化01背包算法解决刷题问题,确保达到及格标准的同时最大化利用剩余时间。通过计算作业所需时间并结合分数价值,博主展示了如何使用编程实现这一过程。

1926 小书童

小A只剩r个单位时间,他想在及格的基础上更多地刷题
很明显,这是一个背包的问题,背包的问题通常就是给定每个物品的什么什么什么,求最大的价值
不得不说,开头的话很很有内涵,哈哈哈
要想计算出刷题的时间,只需要算出写作业的时间,最后减去就好了
也就是用01背包来算出来f数组,最后判断及格的个数,求出来的就是剩余的时间,从小到大,先刷时间短的

#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m;
int k,r;
int a[20];//刷题的时间
int w[20];//作业的时间
int c[20];//作业的价值 
int f[505];//能够得到的分数 
int time_,ans;//time_剩下的时间,ans刷题个数 
int main()
{
	cin>>n>>m>>k>>r;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	sort(a+1,a+1+n);
	for(int i=1;i<=m;i++)
		cin>>w[i];
		
	 for(int i=1;i<=m;i++)
	 	cin>>c[i];
	for(int i=1;i<=n;i++)
	{
		for(int j=r;j>=w[i];j--)
		{
			f[j]=max(f[j],f[j-w[i]]+c[i]); 
		}
	 } 
	 for(int i=1;i<=r;i++)
	 {
	 	if(f[i]>=k)//及格 
	 	{
	 		time_=r-i;//减去写作业的时间 
	 		break;
		 }
	 }
	 for(int i=1;i<=n;i++)
	 {
	 	time_-=a[i];//刷了一道题
		if(time_<=0) break;//没时间
		ans++;//记录刷题数量 
	 }
	 cout<<ans<<endl;
	return 0;
}
``` #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 200; int shua[N],home[N],s[N]; int f[N],dp[N]; int main() { int n,m,k,r; cin>>n>>m>>k>>r; for(int i=1;i<=n;i++) cin>>shua[i]; for(int i=1;i<=m;i++) cin>>home[i]; for (int i = 1; i <= m; i ++ ) cin>>s[i]; for(int i=1;i<=m;i++){ for(int j=r;j>=home[i];j--){ f[j]=max(f[j],f[j-home[i]]+s[i]); } } int ans1; for(int i=1;i<=r;i++){ // cout<<i<<' '<<f[i]<<endl; if(f[i]>=k) { ans1=i; break; } } ans1=r-ans1; // cout<<ans1<<endl; for(int i=1;i<=n;i++){ // cout<<shua[i]<<endl; for(int j=ans1;j>=shua[i];j--){ dp[j]=max(dp[j],dp[j-shua[i]]+1); } } cout<<dp[ans1]; return 0; }```# P1926 小书童——刷题大军 ## 题目背景 数学是火,点亮物理的灯;物理是灯,照亮化学的路;化学是路,通向生物的坑;生物是坑,埋葬学理的人。 文言是火,点亮历史宫灯;历史是灯,照亮社会之路;社会是路,通向哲学大坑;哲学是坑,埋葬文科生。——小 A ## 题目描述 小 A “刷题”十分猖狂,明目张胆地“刷题”。他现在在小书童里发现了 $n$ 样他喜欢的“题目”,每“题”都有他的需要时间,而老师布置了 $m$ 项作业,每项作业都有它的需要时间及分值,老师规定 $k$ 分以上算及格。小 A 只剩 $r$ 个单位时间,他想在及格的基础上更多地“刷题”。 ## 输入格式 第一行四个整数 $n,m,k,r$。 第二行有 $n$ 个数,代表每“题”他的需要时间。 第三行有 $m$ 个数,表示每项作业它的需要时间。 第四行有 $m$ 个数,代表每项作业它的分值。 ## 输出格式 一个数,代表小 A 能刷几道题。 ## 输入输出样例 #1 ### 输入 #1 ``` 3 4 20 100 15 20 50 10 15 40 40 5 5 10 15 ``` ### 输出 #1 ``` 2 ``` ## 说明/提示 ### 数据范围及约定 对于 $100\%$ 的数据,$n\le 10$,$m\le 10$,$k\le 50$,$r\le 150$。数据保证没有不能及格的情况。
03-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值