RQNOJ PID57 / 找啊找啊找GF
题意:sqybi现在有m块大洋,r的人品。请i号MM吃饭要花rmb[i]块大洋.要耗费rp[i]的人品,time[i]的时间 求他泡到最多的MM花费的最少时间是多少
【思路】 扩展的01背包了。。 再多加一维 和一个记录时间的数组就可以了 d[j][k]:将前i个mm中 用j块大洋 k单位人品 最多可以泡到几个
d[j][k]=max(d[j-rmb[i]][k-rp[i]]+1)
ac 代码
#include<string.h> #include<stdio.h> //using namespace std; int d[102][102],r[102],rmb[102],rp[102],time[102],cost[102][102]; int main() { int i,j,n,m,t,r,k; while(~scanf("%d",&n)) { for(i=0;i<n;i++) scanf("%d%d%d",&rmb[i],&rp[i],&time[i]); scanf("%d%d",&m,&r); for(i=0;i<=m;i++) for(j=0;j<=r;j++) cost[i][j]=10000000; memset(d,0,sizeof(d)); //d[0][0]=1; cost[0][0]=0; for(i=0;i<n;i++) for(j=m;j>=rmb[i];j--) for(k=r;k>=rp[i];k--) { if(d[j][k]<d[j-rmb[i]][k-rp[i]]+1) { d[j][k]=d[j-rmb[i]][k-rp[i]]+1; cost[j][k]=cost[j-rmb[i]][k-rp[i]]+time[i]; } if(d[j][k]==d[j-rmb[i]][k-rp[i]]+1&&cost[j][k]>cost[j-rmb[i]][k-rp[i]]+time[i]) cost[j][k]=cost[j-rmb[i]][k-rp[i]]+time[i]; } int ans=0; for(i=0;i<=m;i++) for(j=0;j<=r;j++) if(ans<d[i][j]) ans=d[i][j]; int final=10000000; for(i=0;i<=m;i++) for(j=0;j<=r;j++) if(d[i][j]==ans&&final>cost[i][j]) final=cost[i][j]; printf("%d\n",final); } return 0; }