zoukankan      html  css  js  c++  java
  • 01package

                              01-package

      时间限制 : 1000 ms    内存限制 : 32 MB

       提交次数 : 47    通过次数 : 12

    题目描述

    给定一个背包的容量k,给定n个物品的体积和价值,物品不可分割,将n个物品中选若干个物品放入背包,求背包内物品的最大价值总和,在价值总和最大的前提下求背包内的最小物品个数c。
    

    输入描述

    第一行是一个整数t,表示测试数据的组数t。
    对于每组测试数据,第一行是两个整数n和k,表示物品的个数和背包的容量;
    接下来n行,每行两个整数,分别是物品的价值和体积。
    

    输出描述

    输出背包内物品的最大价值v,在价值最大的前提下求背包内的最小物品个数c,中间用一个空格隔开。
    

    样例输入

    1
    3 10
    4 5
    6 5
    10 10
    

    样例输出

    10 1
    

    作者

    xiewenxiu

    题目添加

    xiewenxiu
        代码提交  |  题目列表  |  统计

    #include <iostream>
    #define MAX 1002
    using namespace std;
    struct node
    {
        
    int num;
        
    int sv;
    }dp[MAX];
    struct nodeData
    {
        
    int value;
        
    int w;
    }data[MAX];
    int n,c,t;
    void Init()
    {
        
    int i;
        scanf(
    "%d%d",&n,&c);
        
    for(i=1;i<=n;i++)
            scanf(
    "%d%d",&data[i].value,&data[i].w);
    }
    int GetMin(int a,int b)
    {
        
    if(a>b)
            
    return b;
        
    else
            
    return a;
    }
    void Knapsack()
    {
        
    int i,j;
        
    for(i=0;i<data[n].w;i++)  //初始化
        {
            dp[i].sv
    =0;
            dp[i].num
    =0;
        }
        
    for(;i<=c;i++)
        {
            dp[i].sv
    =data[n].value;
            dp[i].num
    =1;
        }
        
    for(i=n-1;i>=1;i--)
            
    for(j=c;j>=data[i].w;j--)  //for(j=m;j>=data[i].w;j--)也可以
            {
                
    if(j>=data[i].w)
                {
                    
    int temp=dp[j-data[i].w].sv+data[i].value,tNum=dp[j-data[i].w].num;
                    
    if(dp[j].sv<temp)
                    {
                        dp[j].sv
    =temp;
                        dp[j].num
    =tNum+1;
                    }
                    
    else if(dp[j].sv==temp)
                    {
                        dp[j].num
    =GetMin(dp[j].num,tNum+1);
                    }
                }
            }
        printf(
    "%d %d\n",dp[c].sv,dp[c].num);
    }
    int main()
    {
        scanf(
    "%d",&t);
        
    while(t--)
        {
            Init();
            Knapsack();
        }
        
    return 0;
    }

  • 相关阅读:
    利用正则表达式去掉html代码
    TYPE='application/xshockwaveflash'
    SQL存储过程事务和优化方法(包括查询方式语句结合)
    C#中Bitmap类实现对图像操作的一些方法
    回首往事,碩果累累,展望未來,信心滿懷。
    此方法用于确认用户输入的不是恶意信息
    js去除字符串中的空格
    SQLServer存储过程中的简单事务处理
    SQL 2000中行加入序号用法
    C#中将byte数组转换为8bit灰度图像
  • 原文地址:https://www.cnblogs.com/forever4444/p/1452890.html
Copyright © 2011-2022 走看看