随笔 - 530  文章 - 0  评论 - 3  阅读 - 10098 

题目

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#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;
 }

 

posted on   towboat  阅读(22)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示