题意:有一排 n n 棵树,每棵树木上有只鸟,每次从一棵树上召唤一只鸟要消耗 costi c o s t i 魔力,同时,每召唤一只鸟,召唤鸟的魔力消耗都会增加 B B .一个人初始有魔力,每到一颗新的树下,会获得 X X 魔力,同时这个人只能从左往右走。问最多召唤鸟的数目
思路:动态规划,设定状态表示在第 i i 棵树下,已经召唤只鸟所需要消耗最少的魔力。状态转移即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MOD = 1e9 + 7;
const ll MAXN = 1e5;
ll dp[2][MAXN];
ll cst[MAXN];
ll bird[MAXN];
int n;
ll w,b,x;
int up=0;
int main()
{
ios::sync_with_stdio(false);
while(cin>>n>>w>>b>>x)
{
up=0;
for(int i=0;i<n;i++)
{
cin>>bird[i];
up+=bird[i];
}
for(int i=0;i<n;i++)cin>>cst[i];
memset(dp,-1,sizeof dp);
int p=0;
dp[p][0]=w;
for(int i=0;i<n;i++)
{
// cout<<bird[i]<<endl;
// cout<<up<<endl;
for(int j=0;j<=up;j++)
{
// cout<<"ff"<<endl;
if(dp[p][j]==-1)continue;
for(int k=0;k<=bird[i];k++)
{
if(k*cst[i]>dp[p][j])break;
if(dp[p^1][k+j]==-1)
dp[p^1][k+j]=min(dp[p][j]-k*cst[i]+x,w+(k+j)*b);
else dp[p^1][k+j]=max(dp[p^1][j+k],min(dp[p][j]-k*cst[i]+x,w+(k+j)*b));
}
}
p^=1;
// cout<<p<<endl;
}
int ans=0;
for(int i=0;i<=up;i++)if(dp[p][i]!=-1)ans=i;
cout<<ans<<endl;
}
}