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; }