zoukankan      html  css  js  c++  java
  • CODEVS——T 1005 生日礼物

    http://codevs.cn/problem/1005/

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
     
     
    题目描述 Description

           9月12日是小松的朋友小寒的生日。小松知道小寒特别喜欢蝴蝶,所以决定折蝴蝶作为给小寒的生日礼物。他来到了PK大学最大的一家地下超市,在超市里,小松找到了n种可以用来折纸的本子。每种类型的本子里有若干不同颜色的纸若干张,当然同种类型的本子一定是完全一样的,而不同种类型的本子不一定完全不一样。他统计了一下,这里总共有n种不同类型的可以用来折纸的本子,每种本子各有bi本,所有的纸中有m种颜色是小寒所喜欢的颜色。小松希望他折的每种颜色的蝴蝶的数目是一样的。换句话说,小松必须折m*k只蝴蝶,其中k代表每种颜色蝴蝶的数目,这个数由小松自己来决定。但是小松又不能浪费纸,也就是说他买的本子中,只要是小寒喜欢的颜色的纸都要被折成蝴蝶。于是问题来了,每种类型的本子应该各买多少本,才能折出这m*k只蝴蝶呢?当然,由于小松是个很懒的人,他希望折的蝴蝶数目越少越好,只要表达了心意就可以了(也就是不能1只也不折)。而如果小松总共必须折1000只以上的蝴蝶才能满足要求,那么他就宁愿换一种礼物的方案了。

    输入描述 Input Description

           输入的第一行包含2个整数n(1≤n8),m(1≤m10)。表示有n种不同类型的本子和m种小寒喜欢的颜色。接下来一个n*m的矩阵。第i行第j列的整数aij表示在第i种类型的本子中包含小寒喜欢的颜色j的纸有aij(1≤aij100)张。再接下来的一排n个整数b1bn,表示每种颜色的本子在超市中有多少本(1≤bi5)。

    输出描述 Output Description

           输出包含一个整数,表示小松最少需要折的蝴蝶数目,如果该数目超过1000,则输出”alternative!”。(由于可能存在多种买本子的方案,所以这里就不要求输出具体方案了)

    样例输入 Sample Input

    2 3

    2 1 2

    4 8 4

    5 5

    样例输出 Sample Output

    36

    数据范围及提示 Data Size & Hint

     

     1 #include <cstdio>
     2 
     3 int n,m,ans=1<<30;
     4 int a[26][26],b[26],sum[26];
     5 
     6 bool check()
     7 {
     8     for(int i=1;i<m;i++)
     9         if(sum[i]!=sum[i+1])
    10             return false;
    11     return true;
    12 }
    13 void DFS(int now)
    14 {
    15 //    if(ans!=(1<<30)) return ;
    16     for(int i=0;i<=b[now];i++)
    17     {
    18         for(int j=1;j<=m;j++)
    19             sum[j]+=a[now][j]*i;
    20         if(now<n) DFS(now+1);
    21         else
    22         {
    23             if(check())
    24             {
    25                 if(sum[1]>0&&sum[1]*m<ans)
    26                     ans=sum[1]*m;
    27             }
    28         }
    29         for(int j=1;j<=m;j++)
    30             sum[j]-=a[now][j]*i;
    31     }
    32 }
    33 
    34 int main()
    35 {
    36     scanf("%d%d",&n,&m);
    37     for(int i=1;i<=n;i++)
    38       for(int j=1;j<=m;j++)
    39           scanf("%d",&a[i][j]);
    40     for(int i=1;i<=n;i++) scanf("%d",b+i);
    41     DFS(1);
    42     if(ans<=1000) printf("%d
    ",ans);
    43     else printf("alternative!");
    44     return 0;
    45 }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇
    ASP.NET CORE 使用Consul实现服务治理与健康检查(1)——概念篇
    Asp.Net Core 单元测试正确姿势
    如何通过 Docker 部署 Logstash 同步 Mysql 数据库数据到 ElasticSearch
    Asp.Net Core2.2 源码阅读系列——控制台日志源码解析
    使用VS Code 开发.NET CORE 程序指南
    .NetCore下ES查询驱动 PlainElastic .Net 升级官方驱动 Elasticsearch .Net
    重新认识 async/await 语法糖
    EF添加
    EF修改部分字段
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7466869.html
Copyright © 2011-2022 走看看