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

     Problem 2214 Knapsack problem

    Accept: 412    Submit: 1650
    Time Limit: 3000 mSec    Memory Limit : 32768 KB

     Problem Description

    Given a set of n items, each with a weight w[i] and a value v[i], determine a way to choose the items into a knapsack so that the total weight is less than or equal to a given limit B and the total value is as large as possible. Find the maximum total value. (Note that each item can be only chosen once).

     Input

    The first line contains the integer T indicating to the number of test cases.

    For each test case, the first line contains the integers n and B.

    Following n lines provide the information of each item.

    The i-th line contains the weight w[i] and the value v[i] of the i-th item respectively.

    1 <= number of test cases <= 100

    1 <= n <= 500

    1 <= B, w[i] <= 1000000000

    1 <= v[1]+v[2]+...+v[n] <= 5000

    All the inputs are integers.

     Output

    For each test case, output the maximum value.

     Sample Input

    1
    5 15
    12 4
    2 2
    1 1
    4 10
    1 2

     Sample Output

    15
     
    代码如下:
    /*
        0-1背包问题:
        因为重量太大,肯定不能按照原来的标准模型套用,开不了那么大的数组
        但是总价值却小于5000;
    
        根据价值构造dp方程,找到最小的重量能够得到这个价值
        dp[100]=15,就是代表使得价值为100的最小重量为15;
    */
    
    
    #include <iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    const int maxs = 600;
    int n,B;
    int w[maxs];
    int v[maxs];
    int dp[5005];
    int main()
    {
        freopen("in.txt","r",stdin);
        int T;
        cin>>T;
        while(T--)
        {
            int sum = 0;
            scanf("%d%d
    ",&n,&B);
            for(int i=1;i<=n;i++)
                scanf("%d%d",&w[i],&v[i]),sum+=v[i];
            memset(dp,0x3f,sizeof(dp));
            dp[0]=0;
            for(int i=n;i>=1;i--)
                for(int j=sum;j>=v[i];j--)
                    dp[j]=min(dp[j],dp[j-v[i]]+w[i]);
            for(int i=sum;i>=0;i--)
                if(dp[i]<=B)
                {
                    printf("%d
    ",i);
                    break;
                }
    
        }
        return 0;
    }
    
  • 相关阅读:
    PHP 数组函数分类整理
    mysql 数据库中 int(3) 和 int(11) 有区别么???
    理解PHP的运行机制
    类与对象
    PHP函数补完:call_user_func()
    linux 软件安装目录详解
    Linux下安装Redis
    Redis简介,应用场景,优势
    idea自动抽取变量快捷键设置
    全局捕获异常(适用于SpringMvc,SpringBoot项目)
  • 原文地址:https://www.cnblogs.com/wt20/p/5794355.html
Copyright © 2011-2022 走看看