• luogu1833 樱花


    背包问题小合集

    01背包 完全背包 多重背包混着来

    对于01背包:把它想象成最大物品数为1的多重背包

    对于完全背包:把它想象成最大物品数为m/w[i]的多重背包

    对于多重背包:把它想象成。。。等等这本来就是个多重背包

    数据比较水 但是我也写了个倍增优化

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    using namespace std;
    int f[300];
    int v[300],W[300],m[300];
    int i,j;
    int main()
    {
        string ts,te;
        int n;
        cin>>ts>>te;
        cin>>n;
        int a1=0,a2=0;
        int flag1,flag2;
        for(i=0;i<ts.length();i++)if(ts[i]==':')flag1=i;
        for(i=0;i<te.length();i++)if(te[i]==':')flag2=i;
        for(i=0;i<flag1;i++)a1=10*a1+ts[i]-'0';
        int temp=0;
        for(i=flag1+1;i<ts.length();i++)temp=10*temp+ts[i]-'0';
        a1=60*a1+temp;
        for(i=0;i<flag2;i++)a2=10*a2+te[i]-'0';
        temp=0;
        for(i=flag2+1;i<te.length();i++)temp=10*temp+te[i]-'0';
        a2=60*a2+temp;
        
        
        
        
        int w=a2-a1;
        while(n--)
        {
            int i,j;
            int Value,weight,m;
            scanf("%d%d%d",&weight,&Value,&m);
            if(m==0)m=w/weight;
            for(i=0;((1<<(i+1))-1)<=m;i++)
                for(j=w;j>=(weight<<i);j--)f[j]=max(f[j],f[j-(weight<<i)]+(Value<<i));
            weight=weight*m-(weight<<i)+weight;Value=Value*m-(Value<<i)+Value;
            if(weight>0)
                for(j=w;j>=weight;j--)f[j]=max(f[j],f[j-weight]+Value);
        }
        printf("%d",f[w]);
    }
    View Code

    倍增优化详见

     http://www.cnblogs.com/Kong-Ruo/p/7700718.html

  • 相关阅读:
    新组件或功能怎么依附到已有的架构上
    高内聚、低耦合
    软件质量的定义
    软件架构与组件
    架构设计之拥抱着变化而设计(部分讲义分享)
    组件设计原则之概念篇(四)
    抽象类(接口类)的作用
    类,抽象基类,接口类三者间的区别与联系(C++)
    软件的可变性
    软件设计的复杂度
  • 原文地址:https://www.cnblogs.com/Kong-Ruo/p/7700734.html
Copyright © 2020-2023  润新知