站外题求助
  • 板块灌水区
  • 楼主scj_juruo
  • 当前回复11
  • 已保存回复11
  • 发布时间2022/10/3 10:11
  • 上次更新2023/10/27 09:05:59
查看原帖
站外题求助
805551
scj_juruo楼主2022/10/3 10:11

【问题描述】

聪聪列出了 N 件可以为 MM 做的事情,其中第 i 件事包含两个属性 tit_icic_i ,分别是做这件事所需的时间和这件事的重要度。聪聪不能在同一时间做超过一件事情,也就是说他只能一件一件地做,而且在列表中先出现的事情必须在后出现的事情之前做(即不能改变列表上做这些事情的顺序)。由于 MM 很忙,聪聪必须在 TT 的总时间内做完他想做的所有事情。

MM 的好感度是这样定义的:假设在剩余 sis_i 个单位时间的时候聪聪开始做第 ii 件事,则好感度为每件事情的 cic_isis_i 之积的总和。每件事情最多只能被做一次,没做过的事情不会被计入好感度。现在请你从这 NN 件事情中选出一些,使得 MM 的好感度最大。

【输入格式】

输入文件 lily.in 包含 N+1N+1 行。

11 行包含两个正整数 NNTT,分别表示聪聪可以做的事情的数量和总时间。

22 行到 N+1N+1 行,每行包含两个正整数,其中第 i+1i+1 行的两个正整数 tit_icic_i 分别表示做第 ii 件事所需的时间和第 ii 件事的重要度。

【输出格式】

输出文件 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,所有的 tit_icic_i 均不超过 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;
}
2022/10/3 10:11
加载中...