HDOJ 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 杭电 ACM

来源:互联网 发布:淘宝权的女朋友 编辑:程序博客网 时间:2024/05/23 17:01

不用二进制优化也可以AC 就是01背包的方法

这里按PPT优化了 部分空间和时间复杂度从O(n)降低至O(log2(n))

#include<stdio.h>int f[101],v[500],c[500],t,n,m,p,h,x,C,cnt,i,j;int main(){//每种大米最多20袋 二进制优化占5位 至多100种 数组开500足够    scanf("%d",&C);    while(C--){        scanf("%d%d",&n,&m);cnt=0;        while(m--){            scanf("%d%d%d",&p,&h,&x);t=1;            while(x>t){                v[cnt]=p*t;                c[cnt++]=h*t;                x-=t;                t<<=1;            }            v[cnt]=p*x;            c[cnt++]=h*x;        }        for(j=0;j<=n;++j)f[j]=0;        for(i=0;i<cnt;i++)            for(j=n;j>=v[i];j--)                if(f[j-v[i]]+c[i]>f[j])//与01背包一样 只是经过分块的物品可能相同                    f[j]=f[j-v[i]]+c[i];        printf("%d\n",f[n]);    }}


原创粉丝点击