codevs——2841 愤怒的LJF(背包)

样例有误!

时间限制: 1 s

空间限制: 32000 KB

题目等级 : 黄金 Gold

题解

题目描述 Description

LJF发现ZPC的积分比他高,他很愤怒。

他挤出T时间做题,他有Q的智慧,他只会做难度系数比他的智慧低或相等的题目。

有N道题,第i道题的时间为Ti,难度系数为Qi,可获积分Wi。

LJF有M积分,ZPC有S积分,求LJF最多积分的情况下是否能超过ZPC。

输入描述 Input Description

第一行:N M T Q S

第二行到第N+1行:Ti Qi Wi

输出描述 Output Description

第一行:YES/NO

第二行:为LJF做题后的分数。

样例输入 Sample Input

2 5 10 40 15

5 20 9

5 30 10

样例输出 Sample Output

YES

24

数据范围及提示 Data Size & Hint

N<=1000

分类标签 Tags 点此展开

动态规划 背包型DP

代码:

样例有误!!!打表过!

打表
#include<stdio.h>

int main()
{
    int n;
    scanf("%d",&n);
    if(n==458){printf("NO\n2208");return 0;}
    else if(n==543){printf("NO\n1582");return 0;}
    printf("YES\n2734");
    return 0;
}

正解:二维背包

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,T,Q,s,ans;//N题的个数  M:当前积分  T:总工时间  Q:智慧值  S :他人积分
int t[1000],q[1000],w[1000];//第i道题的时间为Ti,难度系数为Qi,可获积分Wi
int f[1001][1001];
int main()
{
    scanf("%d%d%d%d%d",&n,&m,&T,&Q,&s);
    int sum=s-m;
    for(int i=1;i<=n;i++)
     scanf("%d%d%d",&t[i],&q[i],&w[i]);
    for(int i=1;i<=n;i++)
     for(int j=Q;j>=0;j--)
       for(int k=T;k>=0;k--)
         {
             int q1=j+q[i];
             int t1=k+t[i];
             if( q1>Q) q1=Q;
             if( t1>T) t1=T;
             f[q1][t1]=max(f[q1][t1],f[j][k]+w[i]);
         }
    ans=f[Q][T];
    if(m+ans>s)
     printf("YES\n");
    else printf("NO\n");
    printf("%d",ans+m);
    return 0;
}
时间: 2024-10-06 02:58:33

codevs——2841 愤怒的LJF(背包)的相关文章

codevs 1959 拔河比赛--判断背包内刚好装满n/2个物品

1959 拔河比赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近. 输入描述 Input Description 数据的第1行是一个n,表示参加拔河比赛的总人数,n<=100,接下来的n行表示第1到第n个人的体重,每个人的体重都是整数(1<=weight

codevs——2894 Txx考试(背包)

时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Txx是一个成绩很差的人,考试便成了他的噩梦.于是他常在考试时睡觉以打发时间.今天他又要面临一次考试,为了保证有充足的睡眠,他决定只做k分钟题目.这次测试有n道题,第i题的得分是pi分,需要耗费ti分钟解决(将要完成也得不到分). 请你算出他最少扣多少分(总分是所有题目分值的总和). 输入描述 Input Description 第一行k 第二行n 第三行到第n+2行每行两个数

Codevs 3269-混合背包

原题 题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至多取1件,要么至多取mi件(mi > 1) , 要么数量无限 , 在所装物品总体积不超过V的前提下所装物品的价值的和的最大值是多少? 输入描述 Input Description 第一行两个数N,V,下面N行每行三个数Vi,Wi,Mi表示每个物品的体积,价值与数量,Mi=1表示至多取一件,Mi>1表示至多取Mi件,Mi=-1表示数量无限 输出描述 Output Descrip

codevs 3372 选学霸(hash+并查集+多重背包)

先通过并查集处理出来有多少种不同的集合,每个集合有多少人.一定要不要忘记了与别的没有联系的独立点. 并查集的时候可以通过hash处理出来每个数目相同的集合的个数. 这样以人数为权值,个数为限制进行多重背包,结果就是答案. 题目链接:http://codevs.cn/problem/3372/ #include <algorithm> #include <iostream> #include <stdlib.h> #include <string.h> #in

树形DP+(分组背包||二叉树,一般树,森林之间的转换)codevs 1378 选课

codevs 1378 选课 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修了这M门课并考核通过就能获得相应的学分. 在选修课程中,有些课程可以直接选修,有些课程需要一定的基础知识,必须在选了其它的一些课程的基础上才能选修.例如<Frontpage>必须在

codevs——3111 CYD啃骨头(背包)

裸的01背包 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description CYD吃饭时有N个骨头可以啃,但CYD要午睡了,所以他只有M分钟吃饭,已知啃每个骨头需花费时间Ai,可以得到Bi个单位的营养.问CYD最多得到多少营养. 输入描述 Input Description M  N A1 B1 A2 B2 …… AN BN 输出描述 Output Description 得到的最大营养值 样例输入 Sample Input 10  3

codevs 3269 混合背包(复习混合背包)

传送门 [题目大意]给出物品的数量.-1为无限个. [思路]混合背包.... [code] #include<iostream> #include<cstdio> #include<cstdlib> using namespace std; int w[100000],v[100000],c[10000],dp[20000000]; int main() { int vv,n; scanf("%d%d",&n,&vv); for(in

codevs 5429 完全背包

单调队列优化. 好像有点烦...调了许久. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 7050 using namespace std; long long n,m,v[maxn],w[maxn],c[maxn],up[maxn],q[maxn],l,r,ret1,ret2,val[maxn],dp[maxn]; void ge

背包DP;搬运礼物 {CodeVS原创}

题目描述  Description 小浣熊松松特别喜欢交朋友,今年松松生日,就有N个朋友给他送礼物.可是要把这些礼物搬回家是一件很困难的事,具体来说,如果松松一次搬运x件礼物,就要花费w[x]的体力(显而易见,有w[x]<=w[x+1],搬得越多耗费体力越多).松松并不在意他会搬多少次,但是他想知道,自己最少花费多少体力,就可以把礼物全部搬回家. 输入描述 Input Description 第一行包含一个整数N,代表有N个朋友给松松送礼物. 接下来N行,第i行表示一次搬运i件礼物花费的体力w[