2043 蛋糕

来源:互联网 发布:公司网络建设方案 编辑:程序博客网 时间:2024/04/27 17:54
描述

大运村楼下的味多美的蛋糕很好吃~~  
(以下内容纯属虚构)
店里的每一个蛋糕都用底部相同,高度可能不同的长方体纸盒包装着,顾客买完单后,味多美会为顾客将这些蛋糕用同样底部大小的长方体袋子装起来(袋子比所有单个蛋糕纸盒都要高)。一个袋子里可以叠放多个蛋糕纸盒,但是总高度不能超出袋子。
为了节约成本,店主希望你计算一下,对每笔交易,最少需要多少个袋子才能满足要求。

明显,这个问题对于刚刚学习算法不久的你来说,或许会有一定的难度,所以在此题中,你只需假定,你总是先装入较低高度的蛋糕。
在上完机后,请思考除去这个假设后应该如何计算。不排除下次或者期末上机出类似的题目。

输入

多组测试数据。每组测试数据占三行,
第一行一个正整数H,表示袋子的高度(1<=H<=100)
第二行一个正整数n,表示顾客买了n个蛋糕(1<n<=50)
第三行有n个正整数,h1,....,hn,表示着包装这n个蛋糕的盒子的高度。(1<=hi<=H)

输出

对每组测试数据输出最少需要的袋子数目,每组数据占一行

样例输入
10
1
10
10
2
8 3
10
5
8 2 10 7 3
样例输出
1
2

4


简单的模拟题,题目已经进行了简化,这题是贪心算法,如果取消掉每次装入最小的,应该用到的是动态规划


#include <stdio.h>int main(){int height;int n;int h[52];int i;int j;int temp;int sum;int upset;while (scanf("%d",&height)!=EOF){sum=1;upset=height;scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&h[i]);}for(i=0;i<n;i++)for(j=i+1;j<n;j++){if(h[i]>h[j]){temp=h[i];h[i]=h[j];h[j]=temp;}}for(i=0;i<n;i++){height-=h[i];if(height<0){i--;height=upset;sum++;}}printf("%d\n",sum);}return 0;}