CSU1640-机智的刷题方式-贪心or背包

来源:互联网 发布:科比保罗联手知乎 编辑:程序博客网 时间:2024/05/18 00:05

S: 机智的刷题方式

Description

小B想参加中南大学2015年大学生程序设计竞赛暑期集训,相信猛刷自然强的小B表示做题进集训队完全不是事~当然刷题还是有一定技巧的,考虑到每种题的分值不一样,难度不一样,小B要在上面做一些权衡。分数与题目对应关系如下:

入门题 1分/题 基础题 2分/题 进阶题 5分/题

首先,小B希望自己能尽快确保自己入选集训队,已知他做每种题目的时间,还需要H分来达到入队要求,请问他最快能在多长时间内达到要求?

然后,小B想试着挑战一下自己的极限。已知他在接下来的时间里还有X的时间拿来刷题,那么他最多能刷到多少分?

Input

多组数据,第一行有一个整数T,表示有T组数据。(T<=100)

以下每组数据第一行有三个整数A,B,C,表示小B做入门题、基础题和进阶题要花的时间的数量。(1<=A、B、C<=100)

然后第二行是2个整数H,X,分别表示小B还需要的分数和接下来小B拿来刷题的时间。(1<=H、X<=10000)

Output

每组数据输出两行,第一行输出小B刷够H分最少所需时间。第二行输出小B可能刷到的最高分数。

Sample Input

41 2 53 101 2 34 101 2 43 72 3 43 7

Sample Output

3103163847

完全背包问题,但是不能直接用,具体看代码

#include <bits/stdc++.h>#define N 10100#define INF 0x3f3f3f3f#define LL long long#define mem(a,n) memset(a,n,sizeof(a))#define fread freopen("in.txt","r",stdin)#define fwrite freopen("out.txt","w",stdout)using namespace std;int t,dp[100*N],m,n;int main(){    ios::sync_with_stdio(false);    int n,m,k,a,b,c,t,maxp,mint;    cin>>k;    while(k--){        cin>>a>>b>>c>>n>>t;        mem(dp,0);        mint=-1,maxp=0;        for(int i=0;i<=100*N;++i){            if(mint!=-1&&i>t){                break;            }            if(i>=a){                dp[i]=max(dp[i-a]+1,dp[i]);            }            if(i>=b){                dp[i]=max(dp[i-b]+2,dp[i]);            }            if(i>=c){                dp[i]=max(dp[i-c]+5,dp[i]);            }            if(mint==-1&&dp[i]>=n){                mint=i;            }            if(i<=t&&dp[i]>maxp){                maxp=dp[i];            }        }        cout<<mint<<endl<<maxp<<endl;    }    return 0;}/**********************************************************************    Problem: 1640    User: CSUzick    Language: C++    Result: AC    Time:44 ms    Memory:5632 kb**********************************************************************/
原创粉丝点击