zoukankan      html  css  js  c++  java
  • nyoj860--又见01背包**************

    又见01背包

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:3
     
    描述
        有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W 
    的物品,求所有挑选方案中物品价值总和的最大值。
      1 <= n <=100
      1 <= wi <= 10^7
      1 <= vi <= 100
      1 <= W <= 10^9
     
    输入
    多组测试数据。
    每组测试数据第一行输入,n 和 W ,接下来有n行,每行输入两个数,代表第i个物品的wi 和 vi。
    输出
    满足题意的最大价值,每组测试数据占一行。
    样例输入
    4 5
    2 3
    1 2
    3 4
    2 2
    样例输出
    7
    来源
    飘谊系列
    上传者
    TC_张友谊
    W太大, 数组会爆, 考虑价值一定时, 求获得当前价值的最小体积, 最后加一个判断。
    #include <cstdio>
    #include <cmath>
    #define N 101
    #define min(a,b) ((a)<(b)?(a):(b))
    const int MAXN = 1e9+1; 
    int wei[N], val[N], dp[N*N];
    int main(){
        int n, m;
        while(scanf("%d%d", &n, &m) != EOF){
            int sum = 0;
            for(int i = 1; i <= n; i++){
                scanf("%d%d", &wei[i], &val[i]);
                sum += val[i];
            }
            for(int i = 1; i <= sum; i++)
                dp[i] = MAXN;
            dp[0] = 0;
            for(int i = 1; i <= n; i++)
                for(int w = sum; w >= val[i]; w--)
                    dp[w]=min(dp[w], dp[w-val[i]]+wei[i]);
            for(int i = sum; i >= 0; i--)
                 if(dp[i] <= m){
                    printf("%d
    ", i); 
                    break;
                }
        }
        return 0;
    }
  • 相关阅读:
    设计模式
    python高亮显示输出
    数据库入门3 数据库设计
    分支循环相关
    软件目录结构规范
    数据库入门2 数据库基础
    三级菜单
    字符串相关问题
    登录接口
    购物车
  • 原文地址:https://www.cnblogs.com/soTired/p/5084981.html
Copyright © 2011-2022 走看看