NC214273. 炒鸡矿工
描述
输入描述
输入共行(或行)。
第一行包含个非负整数。
第二行包含个非负整数,第个数表示。
第三行包含个非负整数,第个数表示。第四行包含个正整数,第个数表示。若,则只有第一行。
输出描述
输出共一行,包含一个非负整数,表示最多能拥有的金矿重量。
示例1
输入:
3 2 2 1 6 1 3 3 0 3 1
输出:
17
说明:
C++(clang++11) 解法, 执行用时: 230ms, 内存消耗: 196768K, 提交时间: 2021-01-11 10:03:34
#include<bits/stdc++.h> using namespace std; int w[5005],s[5005]; long long ans=0,DP[5005][5005],v[5005]; int main() { int i,j,p,c,n,m,t; scanf("%d%d%d%d%d",&p,&c,&n,&m,&t); memset(DP,-0x3f,sizeof(DP)); s[0]=p,v[0]=c,DP[0][0]=m; for(i=1;i<=n;i++)scanf("%d",&w[i]); for(i=1;i<=n;i++)scanf("%lld",&v[i]),v[i]+=v[i-1]; for(i=1;i<=n;i++)scanf("%d",&s[i]); for(i=0;i<=n;i++) { for(j=0;j<=t;j++) { if(j)DP[i][j]=max(DP[i][j],DP[i][j-1]); if(j>=s[i])DP[i][j]=max(DP[i][j],DP[i][j-s[i]]+v[i]); if(i&&DP[i-1][j]>=w[i])DP[i][j]=max(DP[i][j],DP[i-1][j]-w[i]); } } for(i=0;i<=n;i++)ans=max(ans,DP[i][t]); printf("%lld\n",ans); }