zoukankan      html  css  js  c++  java
  • NYOJ背包问题

     1 #include <stdio.h>
     2 struct group{
     3     
     4     int value;
     5     int weight;
     6 
     7 };
     8 void Sort(group bag[],int num)
     9 {
    10     int i,j;
    11     group temp;
    12     for(i=1; i<=num-1; i++)
    13         for(j=1; j<=num-i; j++)
    14             if(bag[j+1].value>bag[j].value)
    15             {
    16                 temp=bag[j];
    17                 bag[j]=bag[j+1];
    18                 bag[j+1]=temp;
    19             }
    20 }
    21 int main()
    22 {
    23     int i,n,num,capacity,sum,m;
    24     group bag[12];    
    25     scanf("%d",&n);
    26     while(n--)
    27     {
    28         scanf("%d%d",&num,&capacity);
    29         for(i=1; i<=num; i++)
    30             scanf("%d%d",&bag[i].value,&bag[i].weight);
    31         Sort(bag,num);
    32         m=sum=0;
    33         for(i=1; i<=num; i++)
    34         {
    35             if(m+bag[i].weight<=capacity)
    36             {
    37                 m+=bag[i].weight;
    38                 sum+=bag[i].weight*bag[i].value;
    39             }
    40             else
    41             {
    42                 sum+=bag[i].value*(capacity-m); //因为m+bag[i].weight>capacity,所以bag[i].weight>capacity-m,不必考虑物品份数不够
    43                 break;
    44             }
    45         }
    46         printf("%d
    ",sum);
    47     }    
    48     return 0;
    49 }
    View Code

    思想是怎样使放入的物体的价值总和最大。
    一开始想复杂,以为不仅要贪心,还要考虑最适,纠结半天。。

    看了看别人的代码,明白。可以这样理解,其实可以把这些要装入的物品分解成一根根细线(3D的样子~~,重量可以分割),然后把它们填入一个圆筒里,这样你不会先装入价值小的,而是努力把价值大的细线填入,这便是单纯的贪心了。 直到填满或物品都放进去。

  • 相关阅读:
    day23
    day22
    day21
    day20
    day19
    day18
    day17
    day16
    day15
    PowerDesigner中NAME和COMMENT的互相转换,需要执行语句
  • 原文地址:https://www.cnblogs.com/the-one/p/3579338.html
Copyright © 2011-2022 走看看