POJ 2184 Cow Exhibition
2013-07-07 10:13
232 查看
链接:http://poj.org/problem?id=2184
题意:一群奶牛要去参加展览。衡量一头奶牛的好差有两个标准:smartness Si (-1000 <= Si <= 1000) and the funness Fi (-1000 <= Fi <= 1000) 。想要从N头奶牛中选出一些使得SUM(Si+Fi)最大,且SUM(Si)
和SUM(Fi)都大于等于0。
分析:如果这题没有“SUM(Si) 和SUM(Fi)都大于等于0”的限制的话,就是简单的01背包,但加上这条限制就不能简单的将两者的和作为背包的物品价值。怎么办呢?我们可以固定一个因素作为背包的物品费用,另一个作为背包的物品价值。就是把一头奶牛的smart作为费用,fun作为价值。这样就把问题转化成了01背包。
状态转移方程:
设dp[i][v]为前i头牛给定smart为v时的最大fun值之和, 则有 dp[i][v] = max(dp[i-1][v-s[i]] + f[i], dp[i-1][v])。由于Si有可能是负数,所以将所有Si+10W。还有要注意的是当Si(即费用)为负的时候状态转移方程递推的过程相反。(因为要保证从某个状态转移过来的一定是上次循环得到的值)
Code:
题意:一群奶牛要去参加展览。衡量一头奶牛的好差有两个标准:smartness Si (-1000 <= Si <= 1000) and the funness Fi (-1000 <= Fi <= 1000) 。想要从N头奶牛中选出一些使得SUM(Si+Fi)最大,且SUM(Si)
和SUM(Fi)都大于等于0。
分析:如果这题没有“SUM(Si) 和SUM(Fi)都大于等于0”的限制的话,就是简单的01背包,但加上这条限制就不能简单的将两者的和作为背包的物品价值。怎么办呢?我们可以固定一个因素作为背包的物品费用,另一个作为背包的物品价值。就是把一头奶牛的smart作为费用,fun作为价值。这样就把问题转化成了01背包。
状态转移方程:
设dp[i][v]为前i头牛给定smart为v时的最大fun值之和, 则有 dp[i][v] = max(dp[i-1][v-s[i]] + f[i], dp[i-1][v])。由于Si有可能是负数,所以将所有Si+10W。还有要注意的是当Si(即费用)为负的时候状态转移方程递推的过程相反。(因为要保证从某个状态转移过来的一定是上次循环得到的值)
Code:
#include<iostream> #include<cstring> #include<cstdio> #define Max(a,b) ((a)>(b)?(a):(b)) using namespace std; const int maxn=100005; const int inf=1000000; int f[maxn<<1],val[105],cost[105]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d %d",&cost[i],&val[i]); for(int i=0;i<=200000;i++) f[i]=-inf; f[100000]=0; for(int i=1;i<=n;i++){ if(cost[i]<=0&&val[i]<=0) continue; if(cost[i]>0){ for(int v=200000;v>=cost[i];v--) if(f[v-cost[i]]>-inf) f[v]=Max(f[v],f[v-cost[i]]+val[i]); } else { for(int v=0;v<=200000+cost[i];v++) if(f[v-cost[i]]>-inf) f[v]=Max(f[v-cost[i]]+val[i],f[v]); } } int ans=0; for(int v=100000;v<=200000;v++) if(f[v]>=0) ans=Max(ans,f[v]+v-100000); printf("%d\n",ans); return 0; }
相关文章推荐
- POJ - 2184 Cow Exhibition(变种01背包...)
- POJ 2184 Cow Exhibition
- POJ 2184 Cow Exhibition 01背包的变形
- poj 2184 Cow Exhibition
- POJ 2184 Cow Exhibition (带负值的01背包)
- poj 2184 Cow Exhibition (变形的01背包)
- POJ 2184 Cow Exhibition(变形01背包)
- POJ 2184 Cow Exhibition(背包)
- POJ 题目2184 Cow Exhibition(背包变形)
- POJ 2184 Cow Exhibition
- POJ 2184 Cow Exhibition
- POJ 2184 Cow Exhibition
- poj 2184 Cow Exhibition (01背包)
- POJ 2184 Cow Exhibition 01背包
- poj 2184 Cow Exhibition(01背包)
- POJ 2184 Cow Exhibition
- POJ-2184 Cow Exhibition(01背包变形)
- poj 2184 Cow Exhibition
- POJ 2184 Cow Exhibition 0-1背包
- poj 2184 Cow Exhibition 背包