题目链接:Knapsack problem

大意:给出T组测试数据,每组给出n个物品和最大容量w.然后依次给出n个物品的价值和体积。

问,最多能盛的物品价值和是多少?

思路:01背包变形,因为w太大,转而以v为下标,求出价值对应的最小体积,然后求出能够满足给出体积的最大价值。

经典题目,思路倒是挺简单的,就是初始化总觉得别扭...T_T大概,因为我要找的是最小值,所以初始化为maxn,就结了?

这个问题好像叫01背包的超大背包...

模拟一下样例吧!

1

5 15 // 初始化为dp[0] = 0;

for (int i=0; i<5; ++i)    // tot = 29

w  v

12 4  i = 0    // dp[4] = 12;

2 2  //dp[6] = 14; dp[4] = 12;  dp[2] = 2;

1 1 // dp[7] = 15; dp[5] = 13; dp[3] = 3; dp[1] = 1;

4 10 // dp[17] = 19; dp[15] = 17; dp[13] = 7; dp[11] = 5; dp[10] = 4;

1 2 // dp[19] = 20; dp[17] = 18; dp[15] = 8; dp[13] = 6; dp[12] = 5;

应该是每次放第i个东西的时候,都是在第i-1个的基础上,当当前容量-当前物品的差的容量已经被更新过,当前容量才有可能继续被更新的。

每个东西的容量都是由前一个推导出来的。

附代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#define inf 1000000000
using namespace std; int v[1010], w[1010];
int dp[5050]; // dp[i] 表示价值为i的时候 重量最小是多少 int main() {
int t;
cin >> t;
while(t--) {
int n, totw;
cin >> n >> totw;
int tot = 0; for (int i=0; i<n; ++i) {
cin >> w[i] >> v[i];
tot += v[i];
} // 初始化?
for (int i=0; i<=tot; ++i) {
dp[i] = inf;
}
dp[0] = 0; for (int i=0; i<n; ++i) {
for (int j=tot; j>=v[i]; --j) {
dp[j] = min(dp[j], dp[j-v[i]]+w[i]);
}
} for (int i=tot; i>=0; --i) {
if (dp[i] <= totw) {
cout << i << endl;
break;
}
}
}
return 0;
}

  

FZU 2214 Knapsack problem 01背包变形的更多相关文章

  1. FZU - 2214 Knapsack problem 01背包逆思维

    Knapsack problem Given a set of n items, each with a weight w[i] and a value v[i], determine a way t ...

  2. FZU 2214 ——Knapsack problem——————【01背包的超大背包】

    2214 Knapsack problem Accept: 6    Submit: 9Time Limit: 3000 mSec    Memory Limit : 32768 KB  Proble ...

  3. FZU 2214 Knapsack problem(背包问题)

    Description 题目描述 Given a set of n items, each with a weight w[i] and a value v[i], determine a way t ...

  4. FZU Problem 2214 Knapsack problem(背包+思维转换)

    转化思维,把价值当成背包容量,选择最小的花费,从上到下枚举,找到当这个最小的花费. #include<iostream> #include<cstring> #include& ...

  5. FZU 2214 Knapsack dp (转化背包)

    就是一个背包裸题,由于物品的重量太大,开不了这么大的数组 所以转化一下,由于价值总和不大于5000,所以把价值看作重量,重量看作价值,那么就是同样的价值下,求一个最轻的重量 #include<c ...

  6. HDU 2639 Bone Collector II(01背包变形【第K大最优解】)

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  7. codeforce Gym 101102A Coins (01背包变形)

    01背包变形,注意dp过程的时候就需要取膜,否则会出错. 代码如下: #include<iostream> #include<cstdio> #include<cstri ...

  8. 【01背包变形】Robberies HDU 2955

    http://acm.hdu.edu.cn/showproblem.php?pid=2955 [题意] 有一个强盗要去几个银行偷盗,他既想多抢点钱,又想尽量不被抓到.已知各个银行 的金钱数和被抓的概率 ...

  9. CF#214 C. Dima and Salad 01背包变形

    C. Dima and Salad 题意 有n种水果,第i个水果有一个美味度ai和能量值bi,现在要选择部分水果做沙拉,假如此时选择了m个水果,要保证\(\frac{\sum_{i=1}^ma_i}{ ...

随机推荐

  1. Java I/O 文件加锁,压缩

    文件加锁: 文件加锁机制允许我们同步访问某个作为共享资源的文件. public class Test { public static void main(String[] args) throws I ...

  2. yii2-获取配置选项的值

    Yii::$app->属性值 e.g:echo Yii::$app->id #输出basic config: $config = [ 'id' => 'basic', 'basePa ...

  3. iOS - OC NSSet 集合

    前言 NSSet:集合 @interface NSSet<__covariant ObjectType> : NSObject <NSCopying, NSMutableCopyin ...

  4. 一切都是对象 Thinking in Java 第二章

    2.1 用引用操作对象 1.对象和引用联系起来,就可以通过引用来操作对象: 2.引用亦可单独存在,即没有和任何对象联系起来:对没有和对象联系起来的引用操作,会报错: 2.2 必须由你创建所有对象 1. ...

  5. (二)程序中的内存&&栈

    一.程序运行为什么需要内存?基本概念? 内存是程序运行的立足之地,程序需要用内存来存储一些变量. 内存管理最终是由操作系统完成的,内存在本质上是一个硬件器件,由硬件系统提供:内存由操作系统统一管理,为 ...

  6. hdu 2256 好神奇的矩阵!

    这题自己一开始硬是不会处理√6 前面的系数,直到看了别人的博客后才知道是怎么解得,不多说,先付上一张图: 推出这个关系后,就很容易了. #include<cstdio> #include& ...

  7. ajax跨域jsonp

    <!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UTF-8&qu ...

  8. 转!论if else与switch的效率高低问题

    转 下面来详细描述switch与ifelse的区别. switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转 ...

  9. 如何在腾讯云上搭建一个人力资源Saas

    版权声明:本文由ihr原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/180 来源:腾云阁 https://www.qclo ...

  10. Unity5中叹为观止的实时GI效果

    http://www.manew.com/thread-43970-1-1.html 今天为大家分享unity与Alex Lovett共同使用unity5制作的Shrine Arch-viz Demo ...