思路一下子就想到了,转移方程却没想好,看到网上一个的思路相同的代码,改的转移方程。

同时dp全部初始化为负无穷,需要注意一下。

AC代码如下:

/**************************************************
Memory: 1884 KB Time: 250 MS
Language: G++ Result: Accepted
**************************************************/
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; /**
题目描述:
n头牛(1-n),每个牛有两个值Si和Fi,选其中任意头,使s和f的和最大,其中s和f各自和都不能为负数
*/ int s[105], f[105];
int dp[200005];
int num[200005];
const int INF = 0x5f5f5f5f; int main()
{
int n;
while (cin >> n)
{
int m = 0; for (int i = 0; i < n; ++i)
{
cin >> s[i] >> f[i];
s[i] += 1000; // 全部加上1000保证非负
m += s[i];
} for (int i = 0; i <= m; ++i) dp[i] = -INF;
memset(num, 0, sizeof num);
dp[0] = 0; // 保证所有dp的值都是正好装满。。 for (int i = 0; i < n; ++i)
{
for (int j = m; j >= s[i]; --j)
{
//if (dp[j] < dp[j - s[i]] + f[i])
if (dp[j] - num[j] * 1000 < dp[j - s[i]] + f[i] - (num[j - s[i]] + 1) * 1000)
{ // 这转移方程我也是醉了。。保证的是s和为j时s和f的和最大
dp[j] = dp[j - s[i]] + f[i];
num[j] = num[j - s[i]] + 1; // 记录用了多少头牛。。
}
//printf("dp[%d]=%d, num[%d]=%d\n", j, dp[j],j, num[j]);
}
} int ans = 0; for (int j = 0; j <= m; ++j)
{
if (dp[j] >= 0 && j - num[j] * 1000 >= 0)
ans = max(ans, dp[j] + j - num[j] * 1000);
} cout << ans << endl;
}
return 0;
}

  

POJ2184Cow Exhibition (01背包变形)的更多相关文章

  1. [POJ 2184]--Cow Exhibition(0-1背包变形)

    题目链接:http://poj.org/problem?id=2184 Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  2. POJ-2184 Cow Exhibition(01背包变形)

    Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10949 Accepted: 4344 Descr ...

  3. POJ 2184 Cow Exhibition (01背包变形)(或者搜索)

    Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10342   Accepted: 4048 D ...

  4. FZU 2214 Knapsack problem 01背包变形

    题目链接:Knapsack problem 大意:给出T组测试数据,每组给出n个物品和最大容量w.然后依次给出n个物品的价值和体积. 问,最多能盛的物品价值和是多少? 思路:01背包变形,因为w太大, ...

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

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

  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. 【01背包变形】Robberies HDU 2955

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

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

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

  9. (01背包变形) Cow Exhibition (poj 2184)

    http://poj.org/problem?id=2184   Description "Fat and docile, big and dumb, they look so stupid ...

  10. poj 2184 Cow Exhibition(dp之01背包变形)

    Description "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - ...

随机推荐

  1. Oracle索引扫描

    Oracle索引扫描:先通过index查找到索引的值,并根据索引的值对应的rowid值(对于非唯一索引可能返回多个rowid值)直接从表中得到具体的数据.一个rowid唯一的表示一行数据,该行对应的数 ...

  2. SQL导入

    然后将新窗口中所有内容放到你需要复制的那个数据库中->新建查询->修改第一行 USE[新数据库名]-> 运行这段代码->刷新数据库 基本就是选择源数据库和目标数据库,特别注意的 ...

  3. iOS多工程依赖

    导入准备工作 1.建立一个Framework & Library->Cocoa Touch Static Library 取名A,并在A里新建一个类用来测试 2.建立一个demo工程B ...

  4. BZOJ 3343教主的魔法

    Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的 ...

  5. ExpressionTree——让反射性能向硬编码看齐

    缘起 最近又换了工作.然后开心是以后又能比较频繁的关注博客园了.办离职手续的这一个月梳理了下近一年自己写的东西,然后就有了此文以及附带的代码. 反射 关于反射,窃以为,他只是比较慢.在这个前提下,个人 ...

  6. oracle数据库的建表,删除字段,添加字段,修改字段,修改字段......

    1. 使用oracle创建一张表: SQL> create table loginuser( id ,), username ), password ), email ), descriable ...

  7. Ural1387 Vasya's Dad

    Description Vasya's dad is good in maths. Lately his favorite objects have been "beautiful" ...

  8. codeforces 390E Inna and Large Sweet Matrix

    本题的主要算法就是区间更新和区间求和: 可以用线段树和树状数组来做: 感觉线段树写的太麻烦了,看到官方题解上说可以用树状数组做,觉得很神奇,以前用过的树状数组都是单点维护,区间求和的: 其实树状数组还 ...

  9. Ubuntu下Qt编译报错“cannot find -lGL”的解决方案

    转自cannot find -lGL Solved the problem by installing the "libglu1-mesa-dev" package. sudo a ...

  10. Google的代码风格规范,各种语言都很全

    https://code.google.com/p/google-styleguide/