codevs1005 生日礼物

题目描述 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

思路:

简单深搜,枚举本子数,达到递归边界判定,如果各种蝴蝶都相等并且每种蝴蝶的数目小于目前的方案,就记录,到最后再输出

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int n,m,a[20][20],b[20],ans[20],tot,jud[10000];
int dfs(int deep,int add){
    if(add >= tot) return false;
    if(deep == n){
        int cmp = 0;
        if(add == 0) return false;
        if(jud[add]) return false;
        for(int i = 2;i <= m;i++){
            for(int j = 1;j <= n;j++){
                cmp += a[j][i] * ans[j];
            }
            if(cmp!=add) return false;
            cmp = 0;
        }
        tot = min(tot,add);
        jud[add] = 1;
        return true;
    }
    for(int i = 0;i <= b[deep+1];i++){
        ans[deep+1] = i;
        dfs(deep+1,add + ans[deep+1] * a[deep+1][1]);
    }
    return false;
}
int main(){
    tot = 10000000;
    cin>>n>>m;
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j++){
            cin>>a[i][j];
        }
    }
    for(int i = 1;i <= n;i++) cin>>b[i];
    dfs(0,0);
    if(tot*m <= 1000) cout<<tot*m;
    else cout<<"alternative!";
    return 0;
}
时间: 2024-10-25 18:54:45

codevs1005 生日礼物的相关文章

codevs1005生日礼物(dfs)

1005 生日礼物 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 9月12日是小松的朋友小寒的生日.小松知道小寒特别喜欢蝴蝶,所以决定折蝴蝶作为给小寒的生日礼物.他来到了PK大学最大的一家地下超市,在超市里,小松找到了n种可以用来折纸的本子.每种类型的本子里有若干不同颜色的纸若干张,当然同种类型的本子一定是完全一样的,而不同种类型的本子不一定完全不一样.他统计了一下,这里总共有n种不同类型的可以用来折纸的本子,每种本子各有bi

【codevs1005】生日礼物

这个题直接爆搜显然很好想,但是直接爆搜而不剪枝的话最坏复杂度应该是6^10*10,显然会爆炸.开始我并没有想到怎么剪枝,因此只拿了80,看过题解后恍然大悟:我们可以提前处理好第i种本子之后所有的本子每种纸最多还能用多少,搜索的时候,如果发现某种颜色的纸,就算之后所有的该种颜色的纸全部用上都无法超越现在的最大值,则退出 #include<iostream> #include<cstring> #include<cstdio> using namespace std; in

1005 生日礼物

1005 生日礼物 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 9月12日是小松的朋友小寒的生日.小松知道小寒特别喜欢蝴蝶,所以决定折蝴蝶作为给小寒的生日礼物.他来到了PK大学最大的一家地下超市,在超市里,小松找到了n种可以用来折纸的本子.每种类型的本子里有若干不同颜色的纸若干张,当然同种类型的本子一定是完全一样的,而不同种类型的本子不一定完全不一样.他统计了一下,这里总共有n种不同类型的可以用来折纸的本子,每种本子各有bi

生日礼物

这个“礼物”送给我最爱也是最爱我的妈妈. 九月十三,今天这个特别的日子,我差点都给忘了,还是妹妹早上打电话给我才恍然大悟>_<,瞧我这记性. 今天是妈的生日!我竟然给忘了,感觉我这日子过的好糊涂啊┮﹏┭ 在我印象中,从小到大我都很少陪妈过生日,而我的大部分生日都是爸妈陪伴度过的.即使没有陪伴,也总是能收到妈妈的生日礼物.但是我却在妈生日这天不能送妈什么,只是打个电话给妈,早上8点打过去的时候当时她还在上班,后来到中午11点多妈才打开手机接到电话她说工作环境太吵了没听到. 妈,我记得,你最爱唱的

准备生日礼物

京东礼品购http://gift.jd.com/tips/tipsSearch.html 防辐射眼镜.商务蓝牙耳机 投影仪.戒指.照相机 拍立得小米5小懒虫——音乐熊枕感应台灯.激光键盘小米(MI)智能插座 乔希(Gossi)欧式铁艺田园摆钟现代简约创意时钟静音客厅挂钟夜光卧室石英钟表MX1507 MX1507夜光数字盘http://item.jd.com/1409183480.html 高逼格+美观+懒人——升降电脑桌http://item.jd.com/1234737433.html 流动的

1293: [SCOI2009]生日礼物

1293: [SCOI2009]生日礼物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1096  Solved: 584[Submit][Status] Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠,但多个彩珠也可以出现在同一个位置上. 小布生日快到了,于是小西打算剪一段彩带送给小布.为了让礼物彩带足

BZOJ2288: 【POJ Challenge】生日礼物

2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 771  Solved: 238[Submit][Status][Discuss] Description ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物. 自然地,ftiasch想要知道选择元素之和的最大值.你能帮助她吗? Input

BZOJ 1293: [SCOI2009]生日礼物 贪心

1293: [SCOI2009]生日礼物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2513  Solved: 1370[Submit][Status][Discuss] Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠,但多个彩珠也可以出现在同一个位置上. 小布生日快到了,于是小西打算剪一段彩带送给小

【BZOJ 2288】 2288: 【POJ Challenge】生日礼物 (贪心+优先队列+双向链表)

2288: [POJ Challenge]生日礼物 Description ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物. 自然地,ftiasch想要知道选择元素之和的最大值.你能帮助她吗? Input 第1行,两个整数 N (1 ≤ N ≤ 105) 和 M (0 ≤ M ≤ 105), 序列的长度和可以选择的部分. 第2行, N 个整数 A1, A2, ..., AN (0