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

原文地址:https://www.cnblogs.com/Kong-Ruo/p/7700734.html