Happy Programming Contest

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4995

0-1背包,按照时间排序保证总时间最小。以后写if-else注意多continue,还有0-1背包不需要多加一维。

以后注意。

View Code
const int MM = 1111;
#define debug puts("wrong")
//typedef __int64 int64;
int N,M;
int dp[MM][4];
struct Info{int t,v;}g[MM];
bool cmp(Info x,Info y) {return x.t==y.t?x.v<y.v:x.t<y.t;}
/*
100
10 5
2 4 6 8 10
2 4 6 8 10
*/
void get_data() {
    int i,j,k;
    scanf("%d%d",&M,&N);
    for(i=1;i<=N;i++) scanf("%d",&g[i].t);
    for(i=1;i<=N;i++) scanf("%d",&g[i].v);
    sort(g+1,g+N+1,cmp);
}
void solve() {
    int i,j,k,tmp,t1,tt;
    memset(dp,0,sizeof(dp));
    for(i=1;i<=N;i++) {
        for(j=M;j>=g[i].t;j--) {
            tmp=dp[j-g[i].t][0]+g[i].v;
            if(tmp>dp[j][0]) {
                dp[j][0]=tmp;
                dp[j][1]=dp[j-g[i].t][1]+1;
                dp[j][2]=dp[j-g[i].t][2]+j;
                continue;
            }
            else if(tmp==dp[j][0]) {
                tt=dp[j-g[i].t][1]+1;
                if(tt>dp[j][1]) {
                    dp[j][1]=tt;
                    dp[j][2]=dp[j-g[i].t][2]+j;
                    continue;
                }
                else if(tt==dp[j][1]) {
                    t1=dp[j-g[i].t][2]+j;
                    dp[j][2]=f_min(t1,dp[j][2]);
                    continue;
                }
            }
        //    printf("%d %d %d %d %d\n",i,j,dp[j][0],dp[j][1],dp[j][2]);
        }
    }
    int a1=-1,a2=-1,a3=-1;
    for(i=0;i<=M;i++) {
        if(a1==-1||dp[i][0]>a1) {
            a1=dp[i][0], a2=dp[i][1], a3=dp[i][2];
            continue;
        }
        if(dp[i][0]==a1) {
            if(a2==-1||a2<dp[i][1]) {
                a2=dp[i][1], a3=dp[i][2];
                continue;
            }
            if(a2==dp[i][1]) {
                if(a3==-1||a3>dp[i][2]) a3=dp[i][2];
            }
        }
    }
    printf("%d %d %d\n",a1,a2,a3);
}
int main() {
    int ca; scanf("%d",&ca);
    while(ca--) get_data(),solve();
    return 0;
}

 

posted @ 2013-04-26 13:47  zhang1107  阅读(172)  评论(0编辑  收藏  举报