题解:P3891 [GDOI2014] 采集资源
P3891 [GDOI2014] 采集资源
题意简述:
开始时你有数量为
Solution:
我们考虑先对于每一种花费
然后我们记状态
然后判断结束的标志就是要么
时间复杂度
Code:
#include<bits/stdc++.h> const int N=105; const int M=1005; int w[M],f[N][M]; using namespace std; int n,m,t; inline void init() { for(int i=0;i<N;i++)for(int j=0;j<M;j++)f[i][j]=-1; } inline void Max(int &x,int y) { x = x>y ? x : y; } inline int Min(int x,int y) { return x<y ? x : y; } void work() { cin>>n>>m>>t; if(m>=t){cout<<0;return ;} for(int i=1,x,y;i<=n;i++) { scanf("%d%d",&x,&y); x=Min(x,1000); y=Min(y,1000); for(int j=x;j<=t;j++) { Max(w[j],w[j-x]+y); } } int d=0; init(); f[0][m]=0; while(d<=1000) { if(~f[d][t]){cout<<d;return;} for(int k=0;k<=t;k++)if(~f[d][k]) for(int j=0;j<=k;j++) { if(k-j+w[j]+f[d][k]>=t){cout<<d+1;return;} Max(f[d+1][k-j+w[j]+f[d][k]],f[d][k]+w[j]); } d++; } } int main() { //freopen("P3891.in","r",stdin); //freopen("P3891.out","w",stdout); work(); return 0; }