FZU 2214 Knapsack problem 01背包变形
题目链接: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背包变形的更多相关文章
- 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 ...
- FZU 2214 ——Knapsack problem——————【01背包的超大背包】
2214 Knapsack problem Accept: 6 Submit: 9Time Limit: 3000 mSec Memory Limit : 32768 KB Proble ...
- 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 ...
- FZU Problem 2214 Knapsack problem(背包+思维转换)
转化思维,把价值当成背包容量,选择最小的花费,从上到下枚举,找到当这个最小的花费. #include<iostream> #include<cstring> #include& ...
- FZU 2214 Knapsack dp (转化背包)
就是一个背包裸题,由于物品的重量太大,开不了这么大的数组 所以转化一下,由于价值总和不大于5000,所以把价值看作重量,重量看作价值,那么就是同样的价值下,求一个最轻的重量 #include<c ...
- HDU 2639 Bone Collector II(01背包变形【第K大最优解】)
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- codeforce Gym 101102A Coins (01背包变形)
01背包变形,注意dp过程的时候就需要取膜,否则会出错. 代码如下: #include<iostream> #include<cstdio> #include<cstri ...
- 【01背包变形】Robberies HDU 2955
http://acm.hdu.edu.cn/showproblem.php?pid=2955 [题意] 有一个强盗要去几个银行偷盗,他既想多抢点钱,又想尽量不被抓到.已知各个银行 的金钱数和被抓的概率 ...
- CF#214 C. Dima and Salad 01背包变形
C. Dima and Salad 题意 有n种水果,第i个水果有一个美味度ai和能量值bi,现在要选择部分水果做沙拉,假如此时选择了m个水果,要保证\(\frac{\sum_{i=1}^ma_i}{ ...
随机推荐
- Android中利用SharedPreferences保存信息
package com.example.sharepreferen; import android.content.Context; import android.content.SharedPref ...
- iOS - OC NSDictionary 字典
前言 @interface NSDictionary<__covariant KeyType, __covariant ObjectType> : NSObject <NSCopyi ...
- iOS - TouchID 指纹识别
前言 NS_CLASS_AVAILABLE(10_10, 8_0) @interface LAContext : NSObject 指纹识别功能是 iPhone 5s 推出的,SDK 是 iOS 8. ...
- 美团网基于机器学习方法的POI品类推荐算法
美团网基于机器学习方法的POI品类推荐算法 前言 在美团商家数据中心(MDC),有超过100w的已校准审核的POI数据(我们一般将商家标示为POI,POI基础信息包括:门店名称.品类.电话.地址.坐标 ...
- jQuery扩展插件和拓展函数的写法
<script type="text/JavaScript"> //jQuery插件的写法(需要传入操作对象) ;(function ...
- DDL之操作表
DDL之操作表 DDL是数据定义语言,用来定义数据库对象:数据库.表.列等.其中定义数据库我们已经在DDL之操作数据库中详细讲解了,今天我们来学习使用DDL操作表. 1.创建表 使用数据定义语言创建表 ...
- iOS开发之Xcode 6 国际化
Xcode6 国际化 (1) 新建一个Single View app模版项目,命名为LocalizationTest 1.建立strings文件,命名为Localization.strings 2.点 ...
- Android GestureDetector方法详解
为了加强点击.拖动响应事件,Android提供了GestureDetector手势识别类.通过GestureDetector.OnGestureListener来获取当前被触发的操作手势(Single ...
- 扩展spring data jpa的数据更新方法时注意事项
//此处必须加@Transactional,否则不能运行,报错 @Transactional @Modifying @Query("update ExamItem a set a.versi ...
- activiti jbpm相关资源
Activiti 5.16 用户手册 http://www.mossle.com/docs/activiti/index.html jBPM 4.4开发指南 http://www.mossle.com ...