【问题描述】
聪聪列出了 N 件可以为 MM 做的事情,其中第 i 件事包含两个属性 ti 和 ci ,分别是做这件事所需的时间和这件事的重要度。聪聪不能在同一时间做超过一件事情,也就是说他只能一件一件地做,而且在列表中先出现的事情必须在后出现的事情之前做(即不能改变列表上做这些事情的顺序)。由于 MM 很忙,聪聪必须在 T 的总时间内做完他想做的所有事情。
MM 的好感度是这样定义的:假设在剩余 si 个单位时间的时候聪聪开始做第 i 件事,则好感度为每件事情的 ci 与 si 之积的总和。每件事情最多只能被做一次,没做过的事情不会被计入好感度。现在请你从这 N 件事情中选出一些,使得 MM 的好感度最大。
【输入格式】
输入文件 lily.in 包含 N+1 行。
第 1 行包含两个正整数 N 、T,分别表示聪聪可以做的事情的数量和总时间。
第 2 行到 N+1 行,每行包含两个正整数,其中第 i+1 行的两个正整数 ti 和 ci 分别表示做第 i 件事所需的时间和第 i 件事的重要度。
【输出格式】
输出文件 lily.out 只包含 1 行,输出最大的好感度。
【输入输出样例】 lily.in
3 11
8 9
2 1
2 5
lily.out
114
【输入输出样例解释】 最优方案为在剩余 11 个单位时间的时候开始做第 1 件事(需要 8 个单位时间),剩余 3 个单位时间的时候开始做第 3 件事(需要 2 个单位时间),好感度为 11×9+(11-8)×5=114。
需要注意的是虽然先做第 3 件事,再做第 1 件事的好感度为 11×5+(11-2)×9=136,但这样做是 不允许的,因为第 1 件事必须在第 3 件事之前做。
【数据规模和约定】 对于 20%的数据,N≤10,T≤500。
对于 50%的数据,N≤25,T≤1500。
对于全部的数据,N≤500,T≤20000,所有的 ti 和 ci 均不超过 300。 保证答案在 32 位有符号整型范围内
我写了个代码,但样例过不去。
#include <iostream>
using namespace std;
int t,m,w[101],v[101],f[1001][1001];
int main()
{
cin>>m>>t;
for(int i=1;i<=m;i++)cin>>w[i]>>v[i];
for(int i=1;i<=m;i++)
for(int j=1;j<=t;j++)
if(j<w[i])f[i][j]=f[i-1][j];
else f[i][j]=max(f[i-1][j],f[i-1][j-w[i]])+((j-w[i])*v[i]);
cout<<f[m][t]<<endl;
return 0;
}