http://www.lydsy.com/JudgeOnline/problem.php?id=1569
dp[i][j][a][b] 表示i个职员,发广告状态为j,已有金钱a,声誉b的最少天数
j=0 表示没有发广告,否则j表示距离发广告j天
枚举有t个人增加金钱,那就有i-t个人增加声誉
当j=3时,人数+1
当j=0或j=3时,考虑发不发广告
注意:
1、当天赚的钱可以用来发广告
2、新招募的人当天不能为公司带来收益
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int ans; int dp[][][][]; int main()
{
freopen("data.in","r",stdin);
// freopen("my.out","w",stdout);
int n,x,y,z,A,B;
scanf("%d%d%d%d%d%d",&n,&x,&y,&z,&A,&B);
int ans=ceil(1.0*A/(n*x))+ceil(1.0*B/(n*y));
int ta=max(z,A);
memset(dp,,sizeof(dp));
dp[n][][][]=;
int ni,na,nb;
for(int i=n;i<=;++i)
for(int j=;j<=;++j)
for(int a=;a<=ta;++a)
for(int b=;b<=B;++b)
if(dp[i][j][a][b]<ans)
{
if(a>=A && b>=B)
{
ans=min(ans,dp[i][j][a][b]);
continue;
}
for(int t=;t<=i;++t)
{
na=min(ta,a+t*x);
nb=min(B,b+(i-t)*y);
ni=i;
if(j==) ni++;
if(j== || j==)
{
dp[ni][][na][nb]=min(dp[ni][][na][nb],dp[i][j][a][b]+);
if(na>=z) dp[ni][][na-z][nb]=min(dp[ni][][na-z][nb],dp[i][j][a][b]+);
}
else dp[ni][j+][na][nb]=min(dp[ni][j+][na][nb],dp[i][j][a][b]+);
}
}
printf("%d",ans);
}
1569: [JSOI2008]Blue Mary的职员分配
Time Limit: 15 Sec Memory Limit: 162 MB
Submit: 416 Solved: 178
[Submit][Status][Discuss]
Description
由于Blue Mary呕心沥血的管理,Blue Mary的网络公司蒸蒸日上。现在一共拥有了n名职员,可惜没有任何的金钱和声誉。平均每名每天职员都可以给公司带来x单位金钱或者y单位声誉(名利不能双全)。并且可以花费z单位的金钱在人才交易市场发布广告招聘职员,每次发布广告三天以后就会招聘到一名职员,并且必须在发布广告并且招聘到职员的那一天才能发布下一次广告。 Blue Mary计划以最快的时间获得至少A单位金钱和至少B单位声誉,请你计算一下他至少需要多少时间才能达到他的目标。
Input
输入有且仅有一行,包含六个整数n,x,y,z,A和B,意义如题目描述所述。
Output
要求输出一行,包含一个整数,表示Blue Mary至少需要多少时间才能达到他的目标。
Sample Input
1 2 3 4 5 6
Sample Output
5
HINT
1<=n,x,y,z,A,B<=20