题目链接:https://www.tyvj.cn/Problem_Show.aspx?id=1013
好吧,这题没节操=_=
状态f[u,v,i]表示:消费u的人民币和v的人品同时泡到i个mm所需要的最少时间。
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 using namespace std; 6 int f[101][101][101], r[101], rp[101], t[101], rmb, RP, n, INF=0x7f7f7f7f; 7 int main(void) { 8 freopen("in1.txt","r",stdin); 9 scanf("%d",&n);for(int i=1;i<=n;scanf("%d%d%d",r+i,rp+i,t+i),++i) 10 ;scanf("%d%d",&rmb,&RP); 11 for(int i=0;i<=rmb;++i)for(int j=0;j<=RP;++j)for(int k=1;k<=n;++k)f[i][j][k]=INF; 12 for(int i=1;i<=n;++i)for(int u=rmb;u>=r[i];--u)for(int v=RP;v>=rp[i];--v)for(int j=1;j<=i;++j) 13 if(f[u][v][j-1]!=INF) f[u][v][j]=min(f[u][v][j],f[u-r[i]][v-rp[i]][j-1]+t[i]); 14 for(int i=n;i>=0;--i)if(f[rmb][RP][i]!=INF){printf("%d\n",f[rmb][RP][i]);break;} 15 return 0; 16 }
为了使泡到的mm尽量多,所以要从后往前找合法的解,只要找到就输出,然后break;
=_=