码迷,mamicode.com
首页 > 其他好文 > 详细

luogu1833 樱花

时间:2017-10-20 20:15:26      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:mes   scanf   closed   lib   include   view   display   com   技术分享   

背包问题小合集

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

luogu1833 樱花

标签:mes   scanf   closed   lib   include   view   display   com   技术分享   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!