題解:這題我們需要考慮兩個因素 ,既要有錢,也需要有人品,但是呢,還想花最少得時間泡到最多的女生,那么這題我們就要用到以往的二維dp數組,但是真的是二維的嗎?不,因為要考慮女生的數量以及時間,真正應該是三維的,因此,我們可以得到狀態轉移方程式,
當數量可以增加時,數量和時間都要相應增加,但是當人數不變時,只需要考慮最小時間,吟哦寫出dp方程式
if(dp[j][k][0]<dp[j-rmb[i]][k-rp[i]][0]+1){dp[j][k][0]=dp[j-rmb[i]][k-rp[i]][0]+1;dp[j][k][1]=dp[j-rmb[i]][k-rp[i]][1]+t[i];}if(dp[j][k][0]==dp[j-rmb[i]][k-rp[i]][0]+1)dp[j][k][1]=min(dp[j][k][1],dp[j-rmb[i]][k-rp[i]][1]+t[i]);
?AC代碼:
#include<bits/stdc++.h>
using namespace std;int n,m,r;
int rmb[105],rp[105],t[105];
int dp[105][105][2];
int rmax=0,tmax=0x3f3f3f3f;
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d%d",&rmb[i],&rp[i],&t[i]);}scanf("%d%d",&m,&r);for(int i=1;i<=n;i++){for(int j=m;j>=rmb[i];j--){for(int k=r;k>=rp[i];k--){if(dp[j][k][0]<dp[j-rmb[i]][k-rp[i]][0]+1){dp[j][k][0]=dp[j-rmb[i]][k-rp[i]][0]+1;dp[j][k][1]=dp[j-rmb[i]][k-rp[i]][1]+t[i];}if(dp[j][k][0]==dp[j-rmb[i]][k-rp[i]][0]+1)dp[j][k][1]=min(dp[j][k][1],dp[j-rmb[i]][k-rp[i]][1]+t[i]);}}}printf("%d",dp[m][r][1]);return 0;
}