<span style="color:#000099;">/* 1253.复习计划 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 lily同学一直很努力,可是每年的综合测评都不高。 他思来想去,有一天突然明白了,原来每人都有自己擅长的学科, 而lily总是把大量的时间用于那些学分低,并且自己不擅长的科目。 快要考试了,如何在仅有的D天内复习N门功课,每科需要d天复习,预计能考g分。 而每门课程的学分为m,现在请算出lily可能得到的最高学分积 (注:1、学分积 = 各科成绩*学分 的累加和; 2、要是时间不够,可以放弃一些) 输入 多测例 第一行两个整数:N(N<=10)和 D,后面有N行整数,每行为d g m N等于零标志输入结束。 输出 每个测例的输出占一行,输出一个整数,即可能得到的最高学分积。 输入样例 1 2 1 100 2 3 5 2 89 2 2 60 4 5 59 2 3 5 2 89 2 2 60 4 3 59 4 0 0 输出样例 200 418 476 提示 来源 By yuan.c 2014/6/22 */ #include<stdio.h> #include<iostream> #include<cstring> using namespace std; int N; int D; int n[10]; int d[10]; int g[10]; int m[10]; int grad=0; int a[10][100]; int max(int a,int b) { if(a>=b) return a; else return b; } void sort() { int i,j,t; for(int i=1;i<N;i++) for(int j=1;j<=N;j++) if(d[i]<d[j]){ t=d[i],d[i]=d[j],d[j]=t; t=g[i],g[i]=g[j],g[j]=t; t=m[i],m[i]=m[j],m[j]=t; } } void solve() { int i,j; for(i=0;i<=N;i++) a[i][0]=0; for(j=0;j<=D;j++) a[0][j]=0; for(int i=1;i<=N;i++) for(int j=1;j<=D;j++){ if(j<d[i]) a[i][j]=a[i-1][j]; else a[i][j]=max(a[i-1][j],a[i-1][j-d[i]]+m[i]*g[i]); } cout<<a[N][D]<<endl; } int main() { while(scanf("%d %d",&N,&D)){ if(N==0) break; for(int i=1;i<=N;i++) scanf("%d %d %d",&d[i],&g[i],&m[i]); sort(); if(D==0) cout<<0<<endl; else solve(); memset(d,0,10); memset(m,0,10); memset(g,0,10); memset(a,0,1000);} return 0; } </span>