poj 2184
2015-09-16 16:01
393 查看
一道01背包的变形题。
从题目描述中我们可以看出,对于一头牛,我们可以选或者不选,所以这是一个01背包的雏形。然后每头牛有两个值,一个是s,一个是f,我们可以将其中一个当做cost,一个当做weight,那么对应的一个就是dp[i],一个是i,这样全部求出来以后,我们在全部dp[i]>0的情况中寻找dp[i]+i最大的那个即可。
这道题目还有负数的情况,那么我们可以将背包的容量进行一个偏移,题目中所给数据范围正的最大为100*1000,负的最大为100*-1000,所以我们将10*-1000偏移成0,那么最大就是为2*10*1000,然后对每一个weight[i]来说,如果weight[i]是正的,那么我们逆序循环,这样每头牛最多选中一次,而如果是负数的话,那么我们要顺序循环,这样才能够使得每头牛被选中的次数<=1, 初始化的时候,我们只初始化100*1000为0,其他全为-INF,因为只有这个是符合条件的。
推荐一个博客
从题目描述中我们可以看出,对于一头牛,我们可以选或者不选,所以这是一个01背包的雏形。然后每头牛有两个值,一个是s,一个是f,我们可以将其中一个当做cost,一个当做weight,那么对应的一个就是dp[i],一个是i,这样全部求出来以后,我们在全部dp[i]>0的情况中寻找dp[i]+i最大的那个即可。
这道题目还有负数的情况,那么我们可以将背包的容量进行一个偏移,题目中所给数据范围正的最大为100*1000,负的最大为100*-1000,所以我们将10*-1000偏移成0,那么最大就是为2*10*1000,然后对每一个weight[i]来说,如果weight[i]是正的,那么我们逆序循环,这样每头牛最多选中一次,而如果是负数的话,那么我们要顺序循环,这样才能够使得每头牛被选中的次数<=1, 初始化的时候,我们只初始化100*1000为0,其他全为-INF,因为只有这个是符合条件的。
推荐一个博客
#include<stdio.h> #include<iostream> #include<string> #include<string.h> #include<algorithm> #include<iomanip> #include<vector> #include<time.h> #include<queue> #include<stack> #include<iterator> #include<math.h> #include<stdlib.h> #include<limits.h> #include<map> #include<set> #include<bitset> //#define ONLINE_JUDGE #define eps 1e-5 #define INF 0x7fffffff #define FOR(i,a) for((i)=0;i<(a);(i)++) #define MEM(a) (memset((a),0,sizeof(a))) #define sfs(a) scanf("%s",a) #define sf(a) scanf("%d",&a) #define sfI(a) scanf("%I64d",&a) #define pf(a) printf("%d\n",a) #define pfI(a) printf("%I64d\n",a) #define pfs(a) printf("%s\n",a) #define sfd(a,b) scanf("%d%d",&a,&b) #define sft(a,b,num) scanf("%d%d%d",&a,&b,&num) #define for1(i,a,b) for(int i=(a);i<b;i++) #define for2(i,a,b) for(int i=(a);i<=b;i++) #define for3(i,a,b)for(int i=(b);i>=a;i--) #define MEM1(a) memset(a,0,sizeof(a)) #define MEM2(a) memset(a,-1,sizeof(a)) #define ll __int64 const double PI=acos(-1.0); template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;} template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;} template<class T> inline T Min(T a,T b){return a<b?a:b;} template<class T> inline T Max(T a,T b){return a>b?a:b;} using namespace std; //#pragma comment(linker,"/STACK:1024000000,1024000000") int n,m,q; #define N 200005 #define M 100000 #define Mod 1000000000 #define p(x,y) make_pair(x,y) const int MAX_len=550; int val[110],wt[110]; int dp ; int main(){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); #endif while(sf(n)!=EOF){ for(int i=0;i<n;i++) scanf("%d%d",&val[i],&wt[i]); for(int i=0;i<N;i++) dp[i] = -INF; dp[M] = 0; for(int i=0;i<n;i++){ if(wt[i]>0){ for(int j=N;j>=wt[i];j--){ if(dp[j-wt[i]]>-INF) dp[j] = Max(dp[j],dp[j-wt[i]]+val[i]); } }else{ for(int j=wt[i];j<N+wt[i];j++){ if(dp[j-wt[i]]>-INF) dp[j] = Max(dp[j],dp[j-wt[i]]+val[i]); } } } int ans=0; for(int i=M;i<=2*M;i++){ if(dp[i]>=0){ ans = Max(ans,dp[i]+i-M); } } pf(ans); } return 0; }
相关文章推荐
- Android 开发总结
- POJ 2774 后缀数组:查找最长公共子
- Facebook的Web开发三板斧:React.js、Relay和GraphQL
- cvWaitKey
- MPI Maelstrom---poj1502(最短路模板)
- hdu 5444 Elven Postman
- 通过libcurl向服务端发送数据的2种方式:get/post
- 《netty权威指南》私有协议栈开发
- MVC Kendo总结之-----> TabStrip
- 【转】linux 用户线程、LWP、内核线程学习笔记
- 软件测试之迁移测试
- Unity3D项目融合到Android项目中
- MySQL---外键的用法
- 剑指 offer:链表中倒数第k个结点
- UITableView的使用详解
- 数据结构与算法分析(c++版) #4 单向链表
- web监听器Listener结合定时器Timer
- TCP 传输层面试中常问的问题汇总(你所不知道的传输层)
- 《程序员面试金典》集合栈
- play教程 第六课 play中的session