背包

作者: dachengquan | 来源:发表于2020-08-13 09:49 被阅读0次

    多重背包
    多重背包模板

    #include<stdio.h>
    #define max(a,b) ((a)>(b)?(a):(b))
    const int N = 10010;
    int t[N],c[N],p[N];//时间,美学,观赏次数 
    int f[1010];
    int main(){
        int h1,h2,m1,m2,n,time;
        scanf("%d:%d %d:%d %d",&h1,&m1,&h2,&m2,&n);
        time = (h2-h1)*60+m2-m1;
        for(int i = 1;i<=n;i++){
            scanf("%d%d%d",&t[i],&c[i],&p[i]);
        } 
        for(int i = 1;i<=n;i++){
            int k = p[i];
            if(p[i]==0){
                for(int j = time-t[i];j>=0;j--)
                    f[j]=max(f[j],f[j+t[i]]+c[i]); 
            }
            else{
                for(int z = 1;z<=p[i];z<<=1){
                    p[i]-=z;
                    for(int j = 0;j<=time-z*t[i];j++){
                        f[j] = max(f[j],f[j+z*t[i]]+z*c[i]);
                        //printf("%d %d %d %d %d\n",i,z,j,f[j],k);
                    }   
                }
                if(p[i])
                for(int j = 0;j<=time-p[i]*t[i];j++){
                    f[j] = max(f[j],f[j+p[i]*t[i]]+p[i]*c[i]);
                    //printf("%d %d %d %d\n",i,j,f[j],k);
                }
            }
        }
        int ans = 0;
        for(int i = 0;i<=time;i++)ans = max(ans,f[i]);
        printf("%d",ans);
    } 
    

    相关文章

      网友评论

          本文标题:背包

          本文链接:https://www.haomeiwen.com/subject/rcqbdktx.html