papamelon 344. 奶牛展览 Cow Exhibition(挑战程序设计竞赛) dp
地址 https://www.papamelon.com/problem/344
贝西有权选择让哪些奶牛参加展览。
由于负的智商或情商会造成负面效果,所以贝西不希望出展奶牛的智商之和小于零,或情商之和小于零。
满足这两个条件下,她希望出展奶牛的智商与情商之和越大越好,请帮助贝西求出这个最大值。
输入
第一行:单个整数
1≤N≤100
第二行到第 N+1 行:第
i+1 行有两个整数:
Si 和 Fi,表示第 i 奶牛的智商和情商,
−1000≤Si,Fi≤1000
输出
一个整数:表示情商与智商和的最大值
贝西可以不让任何奶牛参加展览,如果这样做是最好的,输出
0
样例 1
输入
5
-5 7
8 -6
6 -3
2 1
-8 -5
输出
8
解答
很明显的背包问题
但是在数据范围上好多细节
一个是背包的空间太大,需要做空间优化
一个是背包的索引有的是负值。
我们定义dp[i][j] 表示前i个牛的情商为j的情况下最大的智商为多少
然后偏移j的索引为 最大可能负值的一半,也就是100个牛情商全为负数的情况下, maxIdx = 100*-1000/2
#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;
const int N = 20010;
const int M = 110;
const int newZero = 10000;
int dp[M][N];
int n;
int arr[M][2];
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> arr[i][0] >> arr[i][1];
}
memset(dp, -0x3f, sizeof dp);
dp[0][newZero] = 0;
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j < N; j++) {
dp[i][j] = dp[i - 1][j];
int eq = arr[i][0]; int iq = arr[i][1];
if(j-eq <N)
dp[i][j] = max(dp[i][j], dp[i - 1][j - eq] + iq);
if (i == n && j >= newZero && dp[n][j] >= 0) {
if (ans < j + dp[i][j] - newZero) {
//printf("dp[%d][%d]=%d\n",i,j,dp[i][j]);
}
ans = max(ans, j + dp[i][j] - newZero);
}
}
}
cout << ans << endl;
return 0;
}
能过部分数据,但是要过大数据,需要分配[100][2*2000*100] 会报空间过大,这时候我们需要做空间优化
使用滚动数组解决空间问题
#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;
const int N = 200010;
const int M = 110;
const int newZero = 100000;
int dp[2][N];
int n;
int arr[M][2];
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> arr[i][0] >> arr[i][1];
}
memset(dp, -0x3f, sizeof dp);
for (int i = 0; i < N; i++) {
dp[0][i] = -999999999;
dp[1][i] = -999999999;
}
dp[0][newZero] = 0;
int ans = 0;
int curr = 1; int prev = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j < N; j++) {
dp[curr][j] = dp[prev][j];
int eq = arr[i][0]; int iq = arr[i][1];
if(j-eq <N)
dp[curr][j] = max(dp[curr][j], dp[prev][j - eq] + iq);
if (i == n && j >= newZero && dp[curr][j] >= 0) {
ans = max(ans, j + dp[curr][j] - newZero);
}
}
swap(curr, prev);
}
cout << ans << endl;
return 0;
}
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
![阿里打赏](https://files.cnblogs.com/files/itdef/ali2.bmp)
![微信打赏](https://files.cnblogs.com/files/itdef/weixin2.bmp)