题目
n棵树,开始有W元,第i棵树上有num[i]只鸟,第i棵树上的一只鸟要花c[i]元,每走一棵树增加x元,每买一个鸟会让钱包容量增加b,问最多能买到几只鸟?
解答
线性dp,状态f[i][j] ,j是当前拥有鸟的个数
f[i][j] = max{f[i-1][j-k]+X-w[i-1]*k
#include <iostream>
#include <cstring>
using namespace std;
const int N=1002;
#define ll long long
ll num[N],w[N],f[N][10002];
ll n,W,B,X;
int main(){
ll i,j,k;
ll ans=0,S=0;
cin>>n>>W>>B>>X;
for(i=1;i<=n;i++) cin>>num[i];
for(i=1;i<=n;i++) cin>>w[i];
for(i=0;i<=n+1;i++)
for(j=0;j<=10000;j++) f[i][j]=-1;
f[1][0]=W;
for(i=2;i<=n+1;i++){
S+=num[i-1];
for(j=0;j<=S;j++)
for(k=0;k<=min(j,num[i-1]);k++){
if(f[i-1][j-k]==-1) continue;
ll t=f[i-1][j-k]-w[i-1]*k;
if(t>=0)
f[i][j]=max(f[i][j],min(t+X,W+j*B));
}
}
for(j=0;j<=S;j++) if(f[n+1][j]>=0) ans=j;
cout<<ans;
}
浙公网安备 33010602011771号