洛谷:P4399 [JSOI2008]Blue Mary的职员分配
代码:
#include<iostream> using namespace std; int n,x,y,z,A,B,Ans=INT_MAX; void Depth_fs(int staff/*员工*/,int money/*现有钱数*/,int reput/*现有声誉*/,int Dayz/*经过天数*/,int Emcd/*招聘冷却*/) { if(Dayz>Ans) return;//如果已经比现存最优解要差就终止搜索 int disted=1;//已经分配的人数 (因为最后会加到n+1所以初值赋为一) while(disted<=staff&&money<A) {//因为赚钱可以用于招聘员工所以贡献更大故而优先赚钱 (贪心思想) disted++; money+=x; } while(disted<=staff&&reput<B) {//剩余员工用于赚取声誉 disted++; reput+=y; } if(money>=A&&reput>=B) {//钱和声誉都赚够了(因为如果比之前最优解的情况已经被剪掉所以这就是新的最优解) Ans=Dayz; return; } if(Emcd>=0) {//经过一天招聘冷却-1 Emcd--; if(Emcd==0) { staff++; } } Depth_fs(staff,money,reput,Dayz+1,Emcd);//不招聘新员工 if(money>=z&&Emcd<=0) { Depth_fs(staff,money-z,reput,Dayz+1,3);//招聘新员工 } return; } int main() { cin>>n>>x>>y>>z>>A>>B; Depth_fs(n,0,0,1,-1); cout<<Ans; return 0; }
标签:思维,Dayz,int,money,DFS,Emcd,做题,reput,staff From: https://www.cnblogs.com/XdzxBo/p/16808824.html