4
1 2 5
2 1 6
2 2 2
2 2 3
5 5
13
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int N,m,r,f[105][105],g[105][105],ans,mn;//f数量 g时间 struct cc{ int rmb,rp,time; }a[105]; int main(){ // freopen("01.txt","r",stdin); memset(g,127,sizeof(g)); scanf("%d",&N); for(int i=1;i<=N;i++) scanf("%d%d%d",&a[i].rmb,&a[i].rp,&a[i].time); scanf("%d%d",&m,&r);//m--rmb r--rp int inf=g[0][0]; g[0][0]=0; for(int i=1;i<=N;i++){ for(int j=m;j>=a[i].rmb;j--){ for(int k=r;k>=a[i].rp;k--){ if(g[j-a[i].rmb][k-a[i].rp]<inf){ if(f[j][k]<f[j-a[i].rmb][k-a[i].rp] +1){ f[j][k]=f[ j-a[i].rmb ][ k-a[i].rp ] +1; g[j][k]=g[ j-a[i].rmb ][ k-a[i].rp ] + a[i].time; } if(f[j][k]==f[j-a[i].rmb][k-a[i].rp] +1){ g[j][k]=min( g[j][k] , g[ j-a[i].rmb ][ k-a[i].rp ] + a[i].time); } if(f[j][k]>ans){ ans=f[j][k]; mn=g[j][k]; } if(f[j][k]==ans){ mn=min(mn,g[j][k]); // printf("i=%d ans=%d mn=%d\n",i,ans,mn); } } } } } printf("%d\n",mn); return 0; }
【tyvj1013】找啊找啊找GF
用F(i,j)F(i,j)表示消费 i 金钱 j 点 rp 能泡到的最多妹子
做一个01背包
用G(i,j)G(i,j)表示最小的代价
注意逆序,调了1h,其中一个原因就是顺序,导致上一状态被破坏
原文:http://www.cnblogs.com/radiumlrb/p/5774589.html