这题就是很基础的背包问题,不过开始需要先排个序,用到了轮换不等式思想,把最优的顺序排出来,再根据背包进行选择最优解就好。
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;
struct work{
int t;
int s;
}w[3003];
bool cmp(work a,work b){
return a.s*b.t<b.s*a.t;
}
int main(){
int N,T,i;
dp[10005];
while(scanf("%d%d",&N,&T)!=EOF){
for(i=0;i<N;i++){
scanf("%d%d",&w[i].t,&w[i].s);
}
sort(w,w+N,cmp);
memset(dp,0,sizeof(dp));
for(i=0;i<N;i++){
for(int v=T;v-w[i].t>=0;v--){
dp[v]=max(dp[v],dp[v-w[i].t]+w[i].s*v);
}
}
printf("%d\n",dp[T]);
}
return 0;
}