ECNUOJ 2144 抗震机械制造
2015-07-09 10:14
369 查看
[b]抗震机械制造[/b]
Time Limit:1000MS Memory Limit:65536KB
Total Submit:312 Accepted:78
Description
为了应付可能到来的地震,ECNU国国王CS决定花大量资金开发几种矿藏来制造各种救援机械。矿藏一旦被开发就可以无限使用。为了使自己的救援队能应付尽可能多的境况,CS决定让自己的救援队的机械组成尽量多元化。CS数学太弱,面对复杂的机械制造数据,他只好求助于你。
如果CS给你关于机械制造的具体数据,你能帮他计算出他最多能制造多少种救援机械吗?
Input
测试数据以一个整数T(1<=T<=20)开头,表示有T组测试数据。
每组测试数据都以三个整数n(1<=n<=100),m(1<=m<=16),p(1<=p<=16000)开始,n表示可以制造的机械的种数,m表示矿藏的种数,p表示CS最多能花费的资金。
接下来一行有m个整数,第i个整数表示开发第i种矿藏需要的资金。
然后有n行,每行m个数(1或0),第i行第j个数为"1"表示制造第i种机械需要第j种矿藏,若为"0"则表示不需要。
Output
对于每组测试数据,输出CS最多能制造的机械的种数。
Sample Input
2
3 4 1719
409 626 785 108
0 0 0 0
1 0 1 1
1 0 0 0
3 4 1612
268 223 480 947
1 1 1 0
1 1 1 1
0 0 1 0
Sample Output
3
2
Hint:
Case1:开发1,3,4号矿藏即可制造所有的机械,总开销为409+785+108=1302
Case2:开发1,2,3号矿藏即可制造第一种和第三种机械,总开销为268+223+480=971,因为制造第二种机械需要开发第四种矿藏,需要再花费947,超出上限,所以无法达到。
Source
第一届程序设计竞赛
解题:一道暴力枚举题
View Code
Time Limit:1000MS Memory Limit:65536KB
Total Submit:312 Accepted:78
Description
为了应付可能到来的地震,ECNU国国王CS决定花大量资金开发几种矿藏来制造各种救援机械。矿藏一旦被开发就可以无限使用。为了使自己的救援队能应付尽可能多的境况,CS决定让自己的救援队的机械组成尽量多元化。CS数学太弱,面对复杂的机械制造数据,他只好求助于你。
如果CS给你关于机械制造的具体数据,你能帮他计算出他最多能制造多少种救援机械吗?
Input
测试数据以一个整数T(1<=T<=20)开头,表示有T组测试数据。
每组测试数据都以三个整数n(1<=n<=100),m(1<=m<=16),p(1<=p<=16000)开始,n表示可以制造的机械的种数,m表示矿藏的种数,p表示CS最多能花费的资金。
接下来一行有m个整数,第i个整数表示开发第i种矿藏需要的资金。
然后有n行,每行m个数(1或0),第i行第j个数为"1"表示制造第i种机械需要第j种矿藏,若为"0"则表示不需要。
Output
对于每组测试数据,输出CS最多能制造的机械的种数。
Sample Input
2
3 4 1719
409 626 785 108
0 0 0 0
1 0 1 1
1 0 0 0
3 4 1612
268 223 480 947
1 1 1 0
1 1 1 1
0 0 1 0
Sample Output
3
2
Hint:
Case1:开发1,3,4号矿藏即可制造所有的机械,总开销为409+785+108=1302
Case2:开发1,2,3号矿藏即可制造第一种和第三种机械,总开销为268+223+480=971,因为制造第二种机械需要开发第四种矿藏,需要再花费947,超出上限,所以无法达到。
Source
第一届程序设计竞赛
解题:一道暴力枚举题
#include <bits/stdc++.h> using namespace std; int n,m,p,ret; int cost[20],need[110]; void check(int x){ int sum = 0; for(int i = 0; i < n; ++i) if((need[i]&x) == need[i]) sum++; if(sum > ret) ret = sum; } int main(){ int kase,tmp; scanf("%d",&kase); while(kase--){ scanf("%d%d%d",&n,&m,&p); for(int i = 0; i < m; ++i) scanf("%d",cost+i); for(int i = 0; i < n; ++i){ need[i] = 0; for(int j = 0; j < m; ++j){ scanf("%d",&tmp); if(tmp) need[i] |= (1<<j); } } ret = 0; for(int i = 1; i < (1<<m); ++i){ int sum = 0; for(int j = 0; j < m; ++j) sum += ((i>>j)&1)*cost[j]; if(sum > p) continue; else check(i); } printf("%d\n",ret); } return 0; }
View Code
相关文章推荐
- value equality vs. object equality, aliasing, list is mutable DEMO
- 给微商翻案 一个150人的生意有得玩
- hibernate插入中文到mysql数据库乱码
- Lua函数用法研究
- iOS 远程推送的详细配置
- static const
- cocos2d-x初识 CCDirector类的认识
- python基于BeautifulSoup实现抓取网页指定内容的方法
- 7月7日全球域名商(国际域名)解析新增量排名
- 基于Zookeeper的分布式共享锁
- [设计]字象乾坤之字体的性格
- 华为VLAN的ACL策略应用
- SCVMM 2012 R2运维管理九之:添加非信任的Hyper-v主机和群集
- C++ 递增/递减运算符和指针
- [LeetCode][Java] Integer to Roman
- UIWebView 无缝切换到 WKWebView
- 朴素贝叶斯
- Java 并发专题 : Timer的缺陷 用ScheduledExecutorService替代
- LA 3708 - Graveyard
- const char*, char const*, char*const