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
#include
#include
#include//库函数
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;
}

你可能感兴趣的:(背包,01背包,算法,基础)