To be a great programmer

Description

cug是计算机学院的一名学生,他人生最大的理想是成为一个伟大的程序员。他听Jeff说,在ACM网站上做的题目越多,他就会离梦想越近,令他很是神往。我们都知道,完成每道题,要花去不同的时间,会相应取得不等的学习价值。cug每天能花在写程序上的时间是有限的。假设每道题的学习价值都是可以量化的话,问题来了:在有限的时间内,他怎么决策,取得最大的学习效果呢?你,作为一名有经验的选手,你先帮他解决这个问题吧?

Input

输入的第一行有两个整数T(1 <= T <= 1000)和M(1 <= M <= 100),用一个空格隔开,T代表某一天总共能够用来在网站上做题的时间,M代表在这天可供练习的题目。接下来的M行每行包括两个在1到100之间(包括1和100)的整数,分别对应做出这M道题目所耗费的时间和其学习价值。

Output

输出一个整数,表示在规定的时间内,可以取得的最大学习价值。

Sample Input

100 5
77 92
22 22
29 87
50 46
99 90

Sample Output

133
 
第一次做背包问题,简单的01背包问题
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>//库函数
using namespace std;


int main()
{
    int T,M,i,v,c[105],w[105],f[1005];
    scanf("%d%d",&T,&M);
    memset(f,0,sizeof(f));

    for(i=1;i<=M;i++)
       scanf("%d%d",&c[i],&w[i]);
    int ans=0;//注意ans的运用,因为没用ans,WA了
    for(i=1;i<=M;i++)
        for(v=T;v>=c[i];v--)//v>=c[i],否者f[v-c[i]]读入非法内存
            ans=max(ans,f[v]=max(f[v],f[v-c[i]]+w[i]));
    printf("%d\n",ans);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值