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_张友谊


    假设用曾经的背包做这道题。我们会发现质量的范围太大了 无法开数组。

    所以就会想到了转换。

    这道题就是求最少的质量能装最大的价值。

    而我们又发现背包的价值范围不大。就会想到了用价值保存质量。

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    int main()
    {
    	int n,w,wi[105],vi[105],dp[10005];
    	while(scanf("%d %d",&n,&w)!=EOF)
    	{
    		int sum=0;
    		memset(dp,100,sizeof(dp));
    		dp[0]=0;
    		for(int i=0;i<n;i++)
    		scanf("%d %d",&wi[i],&vi[i]),sum+=vi[i];
    		for(int i=0;i<n;i++)
    		{
    			for(int j=sum;j>=vi[i];j--)
       			dp[j]=min(dp[j],dp[j-vi[i]]+wi[i]);
    		}
    		for(int j=sum;j>=0;j--)
    		if(dp[j]<=w)
    		{
    			printf("%d
    ",j);
    			break;
    		}
    	}
    	return 0;
    }/*5 10
    10 5
    10 6
    10 7
    10 1
    10 2*/


  • 相关阅读:
    ES6学习笔记<一> let const class extends super
    js_字符转Unicode
    (转)利用 SVG 和 CSS3 实现有趣的边框动画
    事件委托
    模拟操作
    jQUery动画
    jQUery事件
    jQuery的单选,复选,下拉
    jQuery中对属性的增删改查
    jQuery中其他
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6963291.html
Copyright © 2011-2022 走看看