POJ2184 Cow Exhibition
来源:互联网 发布:什么是usb网络转换器 编辑:程序博客网 时间:2024/06/01 09:59
原题链接: http://poj.org/problem?id=2184
大意:有N个奶牛,每个奶牛都有两种属性,smart和fun,它们都有可能是负数。现在要从这n个奶牛中选一部分,使得选出的奶牛的smart和fun总和达到最大,同时smart的和以及fun的和都必须为正数。
思路:
这道题卡了好久好久,首先,它是0-1背包的一个变形,所以可以把smart看成容积,把fun看成价值。但是,这里容积有可能是负的,所以必须要进行转化。我觉得比较直观的方式是在输入之后,直接把每个smart都加1000,以确保每个smart都是正数。
下面提供两个代码:
#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<iostream>#include<time.h>#include<set>#include<stack>#include<vector>#include<map>#include<queue>#define pi acos(-1)#define maxn 111111#define maxm 11111#define INF 0x3F3F3F3F#define eps 1e-8#define pb push_back#define mem(a) memset(a,0,sizeof a)using namespace std;const long long mod = 1000000007;/**lyc**/void init() {}int dp[222222];int s[111];int f[111];int main() { init(); int n; while(scanf("%d", &n) != EOF) { memset(dp, -INF, sizeof dp); for(int i = 1; i <= n; i++) { scanf("%d%d", s + i, f + i); } dp[100000] = 0; for(int i = 1; i <= n; i++) { if(s[i] < 0 && f[i] < 0) continue; if(s[i] > 0) { for(int j = 200000; j >= s[i]; j--) { if(dp[j - s[i]] > -INF) { dp[j] = max(dp[j], dp[j - s[i]] + f[i]); } } } else { for(int j = 1; j <= 200000 + s[i]; j++) { if(dp[j - s[i]] > -INF) { dp[j] = max(dp[j], dp[j - s[i]] + f[i]); } } } } int ans = 0; for(int i = 100000; i <= 200000; i++) { if(dp[i] > 0) ans = max(ans, dp[i] + i - 100000); } printf("%d\n", ans); } return 0;}
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAX = 100 * 2000 + 10; int ts[MAX]; // total_smart // dp[i][j] meas with cow i, total_funness j, we have maxium sum dp[i][j] // dp[i][j]中的 j 和 tf[j]不一样,j不知道要减去多少个 1000才能得到实际的total_funness int dp[MAX]; struct cow { int s, f; }cows[105]; int max(int a, int b) { return (a > b) ? a : b; } int main(int argc, char const *argv[]) { //freopen("in.txt", "r", stdin); int n; while(cin >> n) { // sum为ts的最大值 int sum = 0; for(int i = 1; i <= n; ++ i) { cin >> cows[i].s >> cows[i].f; cows[i].s += 1000; sum += cows[i].s; } // 初始化为负无穷大 memset(dp, -0x3f, sizeof(dp)); dp[0] = 0; memset(ts, 0, sizeof(ts)); for(int i = 1; i <= n; ++ i) { for(int j = sum; j >= cows[i].s; -- j) { int temp = dp[j - cows[i].s] + cows[i].s - 1000 + cows[i].f; if (dp[j] < temp) { dp[j] = temp; ts[j] = ts[j - cows[i].s] + cows[i].f; } } } // 找出符合 ts >= 0 和 tf >= 0 的最大值 int ans = 0; for(int i = 0; i<= sum; ++ i) { if(dp[i] > ans && ts[i] >= 0 && (dp[i] - ts[i]) >= 0) { ans = dp[i]; } } cout << ans << endl; } return 0; }
阅读全文
0 0
- POJ2184-Cow Exhibition
- poj2184 Cow Exhibition
- poj2184:cow exhibition
- poj2184 Cow Exhibition
- 【POJ2184】Cow Exhibition
- poj2184 Cow Exhibition
- 【poj2184】【Cow Exhibition】
- POJ2184--Cow Exhibition
- POJ2184-Cow Exhibition
- POJ2184 Cow Exhibition
- POJ2184 Cow Exhibition 动态规划
- 【POJ2184】Cow Exhibition 01背包
- POJ2184 Cow Exhibition 【01背包】
- poj2184 Cow Exhibition 01背包 变形
- POJ2184:Cow Exhibition(变种01背包)
- POJ2184---Cow Exhibition(01背包变形)
- poj2184 Cow Exhibition(01背包+变化)
- poj2184(Cow Exhibition) 变形0-1背包
- 计算机为什么使用补码来存储数据
- 分治算法(概念、特性、步骤、复杂度分析、经典例子)
- 55. Jump Game
- oracle得到任意2个经纬度之间的距离
- Window环境上Dubbo-Admin管理平台和Zookeeper注册中心的搭建
- POJ2184 Cow Exhibition
- 使用树莓派3开发板,基于android things 物联网系统来运行TensorFlow解析图像
- SpringMVC的配置及流程
- 韩信点兵
- 数学计算
- 数组
- Linux服务器--IP协议详解
- 【每日一题】查找一个字符串中第一个只出现两次的字符。要求时间复杂度为O(N),空间复杂度为O(1)
- 从字节码角度深入分析内部类(局部内部类,成员内部类,静态内部类,匿名内部类)