思路
这就是一个二维费用问题。
我们定义
f
[
i
]
[
j
]
f[i][j]
f[i][j]为前
i
i
i道菜小明的满意值为
j
j
j的小红的满意值。
所以状态转移方程式为:
dp[i][j]=max(dp[i][j],dp[i−c][j−x]+y);
但我们的的 j j j可能小于 0 0 0,也就是小明的满意值可能小于 0 0 0。但我们的下标不可能小于 0 0 0,所以我们需要特殊处理一下。
把 j j j全部右移 500 500 500。
f[j][k+500]=max(f[j][k+500],f[j-c][k-x+500]+y);
代码
#include <bits/stdc++.h>
using namespace std;
int n,m,f[505][1005],ans=-1;
int main() {
scanf("%d %d",&n,&m);
memset(f,-0x3f,sizeof(f));
f[0][500]=0;
for(int i=1,c,x,y;i<=n;i++) {
scanf("%d %d %d",&c,&x,&y);
for(int j=m;j>=c;j--) {
for(int k=500;k>=-500;k--)
if(k-x>=-500 && k-x<=500) f[j][k+500]=max(f[j][k+500],f[j-c][k-x+500]+y);
}
}
for(int i=0;i<=m;i++) {
for(int j=0;j<=500;j++)
ans=max(ans,f[i][j+500]);
}
printf("%d",ans);
return 0;
}
这里吐槽一下。
明明
∣
X
i
∣
<
=
5
|Xi|<=5
∣Xi∣<=5,为什么我们要右移
500
?
500?
500?