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

P1833 樱花

时间:2020-06-06 00:52:12      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:多重   mat   turn   https   std   int   背包   names   can   

题目:

技术图片

正文:

  • 题目为多重背包,需要注意的点就是如果次数为0的话就把它变成一个极大的数,还有就是时间的计算。
  • 也没什么好说的,直接上代码吧。

Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
using namespace std;
#define R read()
#define GC getchar()
#define ll long long
#define ull unsigned long long
#define INF 0x7fffffff
#define LLINF 0x7fffffffffffffff
ll read(){
    ll s=0,f=1;
    char c=GC;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-f;c=GC;}
    while(c>=‘0‘&&c<=‘9‘){s=s*10+c-‘0‘;c=GC;}
    return s*f;
}
int n,m,t;
int a,b,c;
int v[200010],w[200010];
int f[40010];
int x1,y11,x2,y2;//定义为y11是因为y1是和一个自带的变量重名。
int main(){
    scanf("%d:%d %d:%d %d",&x1,&y11,&x2,&y2,&n);//输入
    m=(x2*60+y2)-(x1*60+y11);//计算时间,以分钟为单位时间
    for(int i=1;i<=n;++i){
        scanf("%d %d %d",&b,&a,&c);
        if(c==0){//c是0,赋值成一个很大的数
            c=1000000;
        }
        for(int j=1;j<=c;j<<=1){//分开
            v[++t]=a*j;
            w[t]=b*j;
            c-=j;
        }
        if(c){//有剩余的直接按*c来就好了
            v[++t]=a*c;
            w[t]=b*c;
        }
    }
    for(int i=1;i<=t;++i){//平平无奇的01背包
        for(int j=m;j>=w[i];--j){
            f[j]=max(f[j],f[j-w[i]]+v[i]);
        }
    }
    printf("%d",f[m]);//输出
    return 0;
}

P1833 樱花

标签:多重   mat   turn   https   std   int   背包   names   can   

原文地址:https://www.cnblogs.com/FUXyao/p/13053070.html

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