ACM水题-数据选取(AC解题报告)
2012-08-13 00:26
381 查看
数据选取
Time Limit:1000MS Memory Limit:32768K
给定1个数m和n个数{a1,a2,...,an},那么请问,最少需要从这n个数中选出多少个,使这些数之和恰好等于m?
Status Submit
题目链接:http://acm.zjut.edu.cn/ShowProblem.aspx?ShowID=1668
Time Limit:1000MS Memory Limit:32768K
Description:
欢迎进入“挂羊头,卖狗肉”专柜~~下面继续~~给定1个数m和n个数{a1,a2,...,an},那么请问,最少需要从这n个数中选出多少个,使这些数之和恰好等于m?
Input:
首先一个整数cas,表示接下来由cas个数据每组数据第一行两个整数m,n(1<=m<=100,1<=n<=10) 第二行包含n个整数,表示数组a, 每个整数在[1,10]之间Output:
如果有满足条件的选法,输出最少需要选出的个数.否则,输出-1 每组输出占一行.Sample Input:
2 32 10 3 10 5 2 6 6 8 1 9 8 76 7 9 1 10 7 3 4 8
Sample Output:
4 -1
Hint:
第一组数据选取{10,6,8,8} ,第二组数据无解。Status Submit
题目链接:http://acm.zjut.edu.cn/ShowProblem.aspx?ShowID=1668
/* ---------------------------------------------------------------------------------- 题目分析:题目的意思显然易见,就是求最少个数之和恰好等于m.按照贪心思想就是,先选择 一个比较m小,但是又是在那堆数里面最大的数,然后再如此选择下一个这样的数.直到将找到和 可以恰好等于又或者找不到为止.如果找到这些数,就直接返回.如果找不到这些数,就回溯到上 一步,重新选择一个比m,但是又是在那堆数里面未选择过的最大的数.如此反复,直到最后. 所以,最终做法就是利用回溯法.时间复杂度是O(nlgn)?是这个吗?我也不知道.遇到回溯题目的 时间复杂度总是不太会算. PS:这里利用了类似于位图的方法,避免从大到小排序花费更多的时间. ---------------------------------------------------------------------------------- */ #include<stdio.h> #include<memory.h> int nNums[104] ; //记录相关数字的个数 int FindMinSelect(int m,int nLen,int nMaxNum) ; int main(void) { int i = 0 ; int n = 0 ; int m = 0 ; int t = 0 ; int nMaxNum = 0 ; int nTemp = 0 ; int nLen = 0 ; freopen("in.txt","r",stdin) ; scanf("%d",&t) ; while(t-- > 0) { memset(nNums,0,sizeof(nNums)) ; scanf("%d%d",&m,&n) ; nLen = 0 ; nMaxNum = -1 ; for(i = 0 ; i < n ; ++i) { scanf("%d",&nTemp) ; nNums[nTemp]++ ; if(nTemp > nMaxNum) { nMaxNum = nTemp ; } } printf("%d\n",FindMinSelect(m,nLen,nMaxNum)) ; //nMaxNum为下一个开始搜索的数,也就是最大下标 } return 0 ; } int FindMinSelect(int m,int nLen,int nMaxNum) { int i = 0 ; int nResult = -1 ; if(0 == m) { return nLen ; } else { for(i = nMaxNum ; i >= 1 ; --i) { if(nNums[i] != 0 && m >= i) //i既是索引又是要选择的数 { m -= i ; nNums[i]-- ; nResult = FindMinSelect(m,nLen+1,i) ; m += i ; nNums[i]++ ; if(nResult != -1) { return nResult ; } } } } return nResult ; }
相关文章推荐
- Pku acm 1274 The Perfect Stall 数据结构题目解题报告(十三)---- 匈牙利算法求二分图的最大匹配
- 【解题报告】BUPT Online Judge Volume 9 Problem 1805 Segments【计算几何】(水题。因为不会用叉积做,自玩了无数次才AC)
- Pku acm 3041 Asteroids 数据结构题目解题报告(十六)---- 匈牙利算法求二分图的最大匹配
- Pku acm 1062 昂贵的聘礼 数据结构题目解题报告(七)—单源最短路径:Dijkstra算法
- YT04-贪心课堂练习-1001 今年暑假不AC-(6.14日-烟台大学ACM预备队解题报告)
- Pku acm 3253 Fence Repair 数据结构题目解题报告(一) ----哈夫曼数
- Pku acm 1125 Stockbroker Grapevine 数据结构题目解题报告(八)---- 弗洛伊德(floyd)算法
- ACM水题-排列(解题报告)
- TYVJ1993 ACM/ICPC 2001 括号序列 解题报告
- 【ACM菜逼解题报告】Ugly Numbers
- 【Jason's_ACM_解题报告】Bandwidth
- 有向图的汇点 -- 兼 ACM PKU POJ 2186 ( Popular Cows ) 解题报告
- Winter-1-E Let the Balloon Rise 解题报告及测试数据
- Winter-2-STL-C Where is the Marble? 解题报告及测试数据
- Pku acm 1088 滑雪 动态规划题目解题报告(十五)
- 北大ACM试题分类 - 实时更新我所有的解题报告链接
- Codeforces Round #256 (Div. 2/A)/Codeforces448A_Rewards(水题)解题报告
- 杭电acm1282 hdu-acm-1282回文数猜想解题报告
- 【Jason's_ACM_解题报告】The Tower of Babylon
- acm-uva10653解题报告