FZU2214 超大背包
2015-12-29 10:07
246 查看
题目大意:给你一个背包,容量为10^9,物品个数500,价值和小于5000,求最大价值
思路:因为容量太大,所以不能按0-1背包问题去求解。注意到物品个数较小,而且价值和只有5000,所以可以逆向思维,求得对应价值下最小的重量,即dp[i]表示总价值为i是的最小重量是多少,则dp[j] = min(dp[j] , dp[j-val[i]]+vol[i]);最后从v(物品总价值开始判断)开始,找到第一个小于等于w(容量)的v即可。。。。
思路:因为容量太大,所以不能按0-1背包问题去求解。注意到物品个数较小,而且价值和只有5000,所以可以逆向思维,求得对应价值下最小的重量,即dp[i]表示总价值为i是的最小重量是多少,则dp[j] = min(dp[j] , dp[j-val[i]]+vol[i]);最后从v(物品总价值开始判断)开始,找到第一个小于等于w(容量)的v即可。。。。
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <fstream> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <vector> #include <map> #include <set> #include <iomanip> using namespace std; #define maxn 10003 #define MOD 1000000007 #define mem(a , b) memset(a , b , sizeof(a)) #define LL __int64 long long dp[5005]; int main() { int t; cin >> t ; while(t --) { int vol[505] , val[505]; memset(dp , 0x3f3f3f3f , sizeof(dp)); long long n , w , v = 0; cin >> n >> w; for(int i = 1 ; i <= n ; i ++ ) { cin >> vol[i] >> val[i]; v += val[i]; } dp[0] = 0; for(int i = 1 ; i <= n ; i ++ ) { for(int j = v ; j >= val[i] ; j --) { if(dp[j - val[i]] + vol[i] < dp[j]) dp[j] = dp[j - val[i]] + vol[i]; } } // cout << dp[v] << endl; for(; v >= 0; v--) { if(dp[v] <= w) { cout << v << endl; break; } } } return 0; }
相关文章推荐
- Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ 解决方法
- Android 微博登录“sso package or sign error” 错误解决方案! (转)
- iOS 国际化 本地化步骤 Localizations
- 推荐系统和搜索引擎的关系达观陈运文
- Linux初体验
- ROS学习笔记(六)::RVIZ::Interactive Markers::Getting Started
- ARC下strong和copy修饰数组的区别
- java 中MD5验证文件一致性
- Spring学习1_Spring注解@Component、@Repository、@Service、@Controller区别
- 微信分享屏蔽跳转appstore解决方法
- 实验室管理系统
- Ruby知识点二:类
- iOS开发swift如何调用系统相册和相机获取图片设置用户头像
- Web Service 权限控制学习(二)
- linux下多线程之pthread_detach(pthread_self())
- 设置返回按钮的图片
- svn server配置与TortoiseSVN、Ankhsvn+VS使用
- 2016 to do list
- THD
- 【JavaScript 从零开始】 原始值和对象引用、类型转换