ZOJ 3689

来源:互联网 发布:java jdk1.8 32位 编辑:程序博客网 时间:2024/05/17 23:35

这题就是很基础的背包问题,不过开始需要先排个序,用到了轮换不等式思想,把最优的顺序排出来,再根据背包进行选择最优解就好。

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


原创粉丝点击