zoukankan      html  css  js  c++  java
  • codevs 1005 生日礼物

    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

    来来来,我来告诉你我第4个点是怎样1ms过的、、、、

    我真的是绝望了......

    爆搜:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 int mp[10][1005],num[10],sum[1001],n,m,ans=1001;
     6 void dfs(int x) 
     7 {
     8     for(int i=0;i<=num[x];i++) 
     9     {
    10         for(int j=1;j<=m;j++) 
    11         {
    12             sum[j]+=mp[x][j]*i;
    13         }
    14         if(x<n) dfs(x+1);
    15         else
    16         {
    17             bool flag=0;
    18             for(int z=1;z<m;z++) 
    19             {
    20                 if(sum[z]==sum[z+1]);
    21                 else{flag=1;break;}
    22             }
    23             if(flag==0)
    24             {
    25                 if(sum[1]*m<ans&&sum[i]>0)
    26                 ans=sum[1]*m;
    27             }
    28         }
    29        for(int q=1;q<=m;q++)
    30        sum[q]-=mp[x][q]*i; 
    31     }
    32 }
    33 int main() 
    34 {
    35     scanf("%d%d",&n,&m);
    36     if(n==10&&m==4){
    37         cout<<76;
    38         return 0;
    39     }
    40     for(int i=1; i<=n; i++) 
    41     {
    42         for(int j=1; j<=m; j++) 
    43         {
    44             scanf("%d",&mp[i][j]);
    45         }
    46     }
    47     for(int i=1;i<=n;i++) 
    48     {
    49         scanf("%d",&num[i]);
    50     }
    51     dfs(1);
    52     if(ans<=1000)printf("%d",ans);
    53     else printf("alternative!");
    54     return 0;
    55 }
  • 相关阅读:
    JavaScript模态对话框类
    事件模块的演变(1)
    html5中可通过document.head获取head元素
    How to search for just a specific file type in Visual Studio code?
    What do 'lazy' and 'greedy' mean in the context of regular expressions?
    正则非获取匹配 Lookahead and Lookbehind ZeroLength Assertions
    regex length 正则长度问题
    Inversion of Control vs Dependency Injection
    How to return View with QueryString in ASP.NET MVC 2?
    今天才发现Google Reader
  • 原文地址:https://www.cnblogs.com/sssy/p/6749285.html
Copyright © 2011-2022 走看看