zoukankan      html  css  js  c++  java
  • nyoj860(01变形)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=860

    又见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
    由于W最大值过大,无法开到这么大的数组,只好换种思路;
    不难发现价值最大就是1w,所以我们不妨从价值入手,计算价值一定时候的最小重量,最后枚举一遍找到符合题意的答案;
    dp[i]:当价值为i时最小的物品总重量

    #include<iostream>
    #include<cstring>
    using namespace std;
    #define inf 0x3f3f3f3f
    int dp[10005]; //dp[i],价值为i时的最小重量
    int main()
    {
    int n,W,i,j,k;
    int w,p;
    while(cin>>n>>W){
    memset(dp,inf,sizeof(dp)),dp[0]=0;
    for(i=1;i<=n;++i) {cin>>w>>p;
    for(j=10000;j>=p;--j) dp[j]=min(dp[j],dp[j-p]+w);
    }
    for(i=10000;i>=0;--i) if(dp[i]!=inf&&dp[i]<=W) {cout<<i<<endl;break;}
    }
    return 0;
    }

  • 相关阅读:
    GetTickCount 和getTickCount
    载入其他同名源文件导致vs编译错误
    opencv的配置
    VS05错误:部署WEB文件失败
    c++移动文件夹
    opencv2.4.0版本不支持Mat的大小自动调整?
    关于c++中public & private方法调用问题
    c++读取文件夹及子文件夹数据
    深入理解java虚拟机-第四章
    深入理解java虚拟机-第三章
  • 原文地址:https://www.cnblogs.com/zzqc/p/6617216.html
Copyright © 2011-2022 走看看