• 【洛谷P1833】樱花


    先说80分代码:最基本的混合背包,判断是完全,01,或是多重,再选择。

    状态转移方程:f[j]=max(f[j],f[j-co[i]]+v[i]);

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int a[10001],c[10001],t[10001],f[10010],n,m;
     4 int main()
     5 {
     6     int x1,y1,x2,y2;
     7     scanf("%d:%d %d:%d",&x1,&y1,&x2,&y2);
     8     if(y1>y2)
     9     {
    10         y2+=60;
    11         x2--;
    12     }
    13     m=(x2-x1)*60+y2-y1;
    14     scanf("%d",&n);
    15     for(int i=1;i<=n;i++)
    16         scanf("%d%d%d",&a[i],&c[i],&t[i]);
    17     for(int i=1;i<=n;i++)
    18     {
    19         if(t[i]==0)
    20         {
    21             for(int j=a[i];j<=m;j++)
    22                 f[j]=max(f[j],f[j-a[i]]+c[i]);
    23         }
    24         else
    25         {
    26             for(int k=1;k<=t[i];k++)
    27             {
    28                 for(int j=m;j>=a[i];j--)
    29                 {
    30                     f[j]=max(f[j],f[j-a[i]]+c[i]);
    31                 }
    32             }
    33         }
    34     }
    35     printf("%d
    ",f[m]);
    36 }

    再说100分代码:把每个物品进行二进制拆分,分成1,2,4,8,16,32,64 ,,,再把花费和价值乘以次数即可。

    例如:某个物品可以用20次,那么可以分成1 2 4 8 5;

    PS:对于完全背包,可以把次数定为一个很大的数,如9999999;

    具体见代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int a[10001],b[10001],c[10001],f[1000010],n,m;
     4 int x1,yy,x2,y2;
     5 int co[1000001],v[1000001],top;
     6 void aaa()
     7 {
     8     for(int i=1;i<=n;i++)
     9     {
    10         int aa=1;
    11         while(c[i]!=0)
    12         {
    13             co[++top]=a[i]*aa;
    14             v[top]=b[i]*aa;
    15             c[i]-=aa;
    16             aa*=2;
    17             if(c[i]<aa)
    18             {
    19                 co[++top]=a[i]*c[i];
    20                 v[top]=b[i]*c[i];
    21                 break;
    22             }
    23         }
    24     }
    25 }
    26 int main()
    27 {
    28     scanf("%d:%d %d:%d",&x1,&yy,&x2,&y2);
    29     if(yy>y2)
    30     {
    31         y2+=60;
    32         x2--;
    33     }
    34     m=(x2-x1)*60+y2-yy;
    35     scanf("%d",&n);
    36     for(int i=1;i<=n;i++)
    37     {
    38         scanf("%d%d%d",&a[i],&b[i],&c[i]);
    39         if(!c[i]) c[i]=9999999;
    40     }
    41     aaa();
    42     for(int i=1;i<=top;i++)
    43         for(int j=m;j>=co[i];j--)
    44             f[j]=max(f[j],f[j-co[i]]+v[i]);
    45     printf("%d
    ",f[m]);
    46 }

    希望能给大家带来帮助!

  • 相关阅读:
    Android移动软件开发总结
    (译)综合指南:通过Ubuntu 16.04上从Source构建来安装支持GPU的Caffe2
    caffe2 环境的搭建以及detectron的配置
    SSD-Tensorflow 从工程角度进行配置
    简单实现Ubuntu16.04 + caffe2 + CUDA9.0 + cuDNN8.0
    Tensorflow1.5.0+cuda9.0+cudnn7.0+gtx1080+ubuntu16.04
    Cuda 9.2 CuDnn7.0 官方文档解读
    解决 Faster R-CNN 图片中框不在一张图片上显示的问题
    (转载)YOLO配置文件理解
    CycleGAN 配置及其实现
  • 原文地址:https://www.cnblogs.com/shl-blog/p/10500804.html
Copyright © 2020-2023  润新知