题解:P10987 [蓝桥杯 2023 国 Python A] 火车运输
这道题是 01 背包变形。
在看完这道题的时候,思路特别清晰,除了这里的价值和质量是一个东西,这不就是 01 背包变成二维了吗?没什么难度啊?
于是,就有了这段代码。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a,b,w[2005],dp[2005][2005],maxx;
signed main()
{
cin>>n>>a>>b;
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<=n;i++)
for(int j=a;j>=w[i];j--)
for(int k=b;k>=w[i];k--)
{
dp[j][k]=max(dp[j][k],dp[j-w[i]][k]+w[i]);
dp[j][k]=max(dp[j][k],dp[j][k-w[i]]+w[i]);
maxx=max(maxx,dp[j][k]);
}
cout<<maxx;
return 0;
}
只有 5 分。
经过一段苦思冥想后,我再次茅塞顿开。这道题的
最后,上代码!!!
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a,b,w[2005],dp[2005][2005],maxx;
signed main()
{
cin>>n>>a>>b;
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<=n;i++)
for(int j=a;j>=0;j--)
for(int k=b;k>=0;k--)
{
if(j>=w[i]) dp[j][k]=max(dp[j][k],dp[j-w[i]][k]+w[i]);
if(k>=w[i]) dp[j][k]=max(dp[j][k],dp[j][k-w[i]]+w[i]);
maxx=max(maxx,dp[j][k]);
}
cout<<maxx;
return 0;
}