• (01背包 当容量特别大的时候) Knapsack problem (fzu 2214)


     

     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

     Source

    第六届福建省大学生程序设计竞赛-重现赛(感谢承办方华侨大学)
     
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <stack>
    #include <map>
    #include <vector>
    #include <queue>
    using namespace std;
    typedef long long LL;
    #define N 2600000
    #define met(a, b) memset(a, b, sizeof(a))
    #define INF 0x3f3f3f3f
    
    int v[550], w[550];
    int dp[N];
    
    int main()
    {
        int T;
        scanf("%d", &T);
        while(T--)
        {
            int i, j, n, B, Max=0, Index;
    
            scanf("%d%d", &n, &B);
    
            for(i=1; i<=n; i++)
            {
                scanf("%d%d", &w[i], &v[i]);
                Max += v[i];
            }
    
            for(i=0; i<=Max; i++)
                dp[i] = INF;
            dp[0] = 0;
            for(i=1; i<=n; i++)
            for(j=Max; j>=v[i]; j--)
            {
               dp[j] = min(dp[j], dp[j-v[i]]+w[i]);
            }
    
            for(i=0; i<=Max; i++)
                if(dp[i]<=B) Index = i;
    
            printf("%d
    ", Index);
    
        }
        return 0;
    }
  • 相关阅读:
    转:javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 解决方案
    Elementui 导航组件和Vuejs路由结合
    python 在线生成文字云
    TensorFlow创建简单的图片分类系统--机器学习
    kettle maven 配置
    Kettle api 二次开发之 日志的保存
    heatmap for arcgisjsapi
    Spring MVC 使用tomcat中配置的数据源
    点坐标旋转方法
    在servlet中使用Spring注入
  • 原文地址:https://www.cnblogs.com/YY56/p/5509864.html
Copyright © 2020-2023  润新知