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天...不行啊...
评论 (0)