背包输出方案 Pro-Test Voting

http://202.120.106.94/onlinejudge/problemshow.php?pro_id=542

背包练习题

简单的概括下题意

有一个函数  f(x)

现有n个未知数x1 x2 x3....xn

sigma(xi)= S

求f(x1)+f(x2)+f(x3)+..+f(xn)的最大值

n  s 的最大值都是100 

这不就是泛化背包吗?每个物品的价值随着你分配给它的体积的变化而变化,最后求体积为S的背包能装进的物品的最大价值

注意相同答案时 要输出前面的体积尽可能大的方案,我很懒,可以参考 这里

View Code
#include<cstdio>
#include<cstring>
struct node{
      double p,ip,k;
}in[101];
int  dp[101][101];
int pre[101][101];
int calc(int f,int id){
    double fp=in[id].ip+(1.0*f/(10.1+f))*in[id].k;
    double tmp = fp*in[id].p/100.0;
    int t=int(tmp+0.5);
    if(t>in[id].p) return in[id].p;
    return t;
}
int main(){
    int n,i,j,k,S,ca=1;
    while(scanf("%d%d",&S,&n),(S||n)){
        for(i=1;i<=n;i++) scanf("%lf%lf%lf",&in[i].p,&in[i].ip,&in[i].k);
        memset(dp,0,sizeof(dp));
        memset(pre,-1,sizeof(pre));
        for(i=n;i>=1;i--){
            for(j=0;j<=S;j++){
                for(k=0;k<=j;k++){
                    int tmp=calc(j-k,i);
                    if(dp[i+1][k]+tmp>dp[i][j]) {
                        dp[i][j]=dp[i+1][k]+tmp;
                        pre[i][j]=k;
                    }
                }
            }
        }
        printf("Case %d: %d\n",ca++,dp[1][S]);
        int t=S;i=1;
        while(i!=n+1){
            if(i!=1) printf(" ");
            printf("%d:%d",i-1,t-pre[i][t]);
            t=pre[i][t];
            i++;
        }
        puts("");
    }
    return 0;
}
posted @ 2012-05-27 14:36  Because Of You  Views(307)  Comments(0Edit  收藏  举报