zoukankan      html  css  js  c++  java
  • 【ACM】nyoj_106_背包问题_201308152026


    背包问题
    时间限制:3000 ms  |  内存限制:65535 KB
    难度:3
    描述
    现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10);如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。
    输入
    第一行输入一个正整数n(1<=n<=5),表示有n组测试数据;
    随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10);s表示有s个物品。接下来的s行每行有两个正整数v,w。
    输出
    输出每组测试数据中背包内的物品的价值和,每次输出占一行。
    样例输入
    1
    3 15
    5 10
    2 8
    3 9
    样例输出
    65


    //贪心算法


    #include <stdio.h>
    #include <stdlib.h>

    typedef struct Node{
        int a;
        int b;
    }Node;

    Node str[12];

    int cmp(const void *a,const void *b)
    {
        return (*(Node *)b).a - (*(Node *)a).a;
    }

    int main()
    {
        int N;
        scanf("%d",&N);
        while(N--)
        {
            int s,m,i,num,sum;
            scanf("%d %d",&m,&s);
            for(i=0;i<m;i++)
            {
                scanf("%d %d",&str[i].a,&str[i].b);
            }
            qsort(str,m,sizeof(str[0]),cmp);
            //for(i=0;i<m;i++)
            //printf("%d %d ",str[i].a,str[i].b);
            num=sum=0;
            for(i=0;i<m;i++)
            {
                num+=str[i].b;
                if(num>s)
                {
                    sum+=(s+str[i].b-num)*str[i].a;
                    break;
                }
                else
                sum+=str[i].a*str[i].b;
            }
            printf("%d ",sum);       
        }
        return 0;
    }

  • 相关阅读:
    在Linux系统中Navicat for MySQL 出现1045错误如何处理
    一个老程序员这些年的心得体会
    忘了
    DAY11
    day10_plus
    day10
    东北育才冲刺noip(day9)
    Java语言Socket接口用法详解
    JDBC-ODBC桥连接方式操纵SQL数据库
    JDBC连接SQL Server 2005步骤详解
  • 原文地址:https://www.cnblogs.com/xl1027515989/p/3260859.html
Copyright © 2011-2022 走看看