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;
    }
    
  • 相关阅读:
    Oracle 10g R2 Transparent Data Encryption 透明数据加密
    Spark之Task原理分析
    一个Spark job的生命历程
    Spark调优秘诀——超详细
    NLP文本相似度(TF-IDF)
    Spark 参数配置的几种方法
    Spark提交应用程序之Spark-Submit分析
    spark_flume_mysql 整合
    Spark Programming Guide《翻译》
    windows下Idea结合maven开发spark和本地调试
  • 原文地址:https://www.cnblogs.com/wt20/p/5794355.html
Copyright © 2011-2022 走看看