RQ57
普通二维背包做法就不说了。看到题解里有一个优化,觉得比较巧妙,说不太清楚,大致是先把time[i]=maxtime-time[i],f[i][j]表示rp是i,rmb是j下的最大剩余时间,然后一般的方程直接套上就行了,这样弄一下把所有东西都满足了...
#include <iostream> using namespace std; #define mtime 20000 #define size 100 int main() { int n,maxrmb,maxrp; int time[size]; int rp[size]; int rmb[size]; int f[300][300]; cin >> n; for (int i=0;i<n;i++) { cin >> rmb[i] >> rp[i] >> time[i]; time[i]=mtime-time[i]; } cin >> maxrmb >> maxrp; for (int i=0;i<n;i++) for (int j=maxrp;j>=rp[i];j--) for (int k=maxrmb;k>=rmb[i];k--) if (f[j-rp[i]][k-rmb[i]]+time[i]>f[j][k]) f[j][k]=f[j-rp[i]][k-rmb[i]]+time[i]; cout << mtime-f[maxrp][maxrmb] % mtime; }
这个..又混了10天...不行啊...