posts - 99,  comments - 8,  trackbacks - 0

这个题目如果直接在sort中比较 Ji / Fi  会出现RUNTIME ERROR  因为 分母不能为 0 ,这里在输入时直接将它算出来用weight 表示
贪心策略:weight最大的

 1#include <iostream>
 2using namespace std;
 3
 4struct food
 5{
 6    int ji; 
 7    int fi;  
 8    double weight; 
 9}
a[1001];
10
11/*int cmp (const void *a, const void *b)
12{
13    return  (*((food *)a)).weight < (*((food *)b)).weight;
14}*/

15
16bool cmp1 (const food &a, const food &b)
17{
18     return a.weight > b.weight;
19}

20
21int main ()
22{
23    int m, n;
24    while ( scanf ("%d %d"&m, &n) != EOF && (m != -1 && n != -1))
25    {
26          double sum = 0
27          //输入处理 
28          for (int i = 0; i < n; i ++)
29          {
30              scanf ("%d %d"&a[i].ji, &a[i].fi);
31              a[i].weight = (1.0 * a[i].ji) / a[i].fi;
32          }

33          
34          printf ("\n");
35          //按每个房间 1 的 猫食能够得到最大数量的Javabeans排序 
36          //qsort (a, n, sizeof(a[0]), cmp);
37          sort (a, a + n, cmp1);
38          
39          for (int i = 0; i < n; i ++)
40          {
41              printf ("%d %d\n", a[i].ji, a[i].fi);
42          }

43          
44          //求的最大量的食物
45          for (int i = 0; i < n; i ++)
46          {
47              if ( m >= a[i].fi)
48              {
49                   m -= a[i].fi;
50                   sum += a[i].ji;
51              }

52              else if ( m < a[i].fi )
53              {
54                   sum += ( m * (1.0 * a[i].ji / a[i].fi ) );  //猫食不够了 
55                   break;
56              }

57          }
 
58          
59          printf ("%.3f\n", sum); 
60    }

61   // system ("pause");
62    return 0;
63}

64
posted on 2010-08-24 18:41 雪黛依梦 阅读(701) 评论(0)  编辑 收藏 引用 所属分类: 背包----贪心、回溯、分支界限

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(4)

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜