#P2056. ABCD
#P2056. ABCD
题目描述
有 4 个长度为 N 的数组 a,b,c,d。现在需要你选择 N 个数构成数组 e,数组 e 满足
并且使得
最大。
输入格式
输入文件共 N+1 行。
第 1 行包含 1 个正整数 N。
第 i+1 行包含 4 个整数 a[i],b[i],c[i],d[i]。
输出格式
输出共 1 行,包含 1 个整数,表示所给出公式的最大值。输入数据保证一定有解。
样例
输入数据 1
5
-1 1 2 5
-2 2 1 2
0 1 1 3
-2 -1 3 10
-2 2 3 9
输出数据 1
2
输入数据 1
10
1 10 1 7
-10 10 2 0
-10 10 2 2
-10 10 2 0
1 10 1 0
-10 10 2 0
10 10 2 0
1 10 1 0
-10 10 2 0
1 10 1 0
输出数据 1
90
数据规模与约定
对于 20%的数据,
对于 60%的数据,
对于 100%的数据,
Solution
这道题可以看作一道多重背包的题,每个物品可以选
可以最简单的多重背包暴力枚举,常数小一点时间可以卡过去,如果担心常数,单调队列优化即可。
如果不对
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<limits.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof(a));
using namespace std;
template<typename T> void read(T &k)
{
k=0;
T flag=1;char b=getchar();
while (b<'0' || b>'9') {flag=(b=='-')?-1:1;b=getchar();}
while (b>='0' && b<='9') {k=(k<<3)+(k<<1)+(b^48);b=getchar();}
k*=flag;
}
const int _SIZE=2e2;
int n;
int a[_SIZE+5],b[_SIZE+5],c[_SIZE+5],d[_SIZE+5];
const int MAXN=5e4;
int f[_SIZE+5][(MAXN<<1)+5];
int main()
{
read(n);
for (int i=0;i<=n;i++)
for (int j=0;j<=(MAXN<<1);j++)
f[i][j]=-INT_MAX/3;
for (int i=1;i<=n;i++)
{
read(a[i]);read(b[i]);
read(c[i]);read(d[i]);
}
int l=0,r=(MAXN<<1);
f[0][MAXN]=0;
for (int i=1;i<=n;i++)
{
for (int j=l;j<=r;j++)
{
for (int k=a[i];k<=b[i];k++)
{
if (j-k*c[i]>=l && j-k*c[i]<=r)
f[i][j]=max(f[i][j],f[i-1][j-k*c[i]]+k*d[i]);
}
}
}
//for (int j=MAXN-5;j<=MAXN+5;j++) printf("%d rm=%d\n",f[1][j],j-MAXN);puts("");
printf("%d\n",f[n][MAXN]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步