一开始想把每块奶酪高度压缩4/5后,价值不变,当作新的物品加入,但是忽略了前提:有大奶酪的时候下面的奶酪才会压缩,而在dp过程中无法加入判断。
正解
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int dp[1500]; //注意数据扩大5/4倍,数组需开大
int h[maxn];
int v[maxn];
int n, t, k;
int main()
{
cin >> n >> t >> k;
for(int i = 1; i <= n; i++)
{
cin >> v[i] >> h[i];
}
for(int i = 1; i <= n; i++)
{
for(int j = h[i]; j <= t * 5 / 4; j++) //完全背包,容量从小到大,列举到5/4倍是因为如果有大奶酪在上面,高度压缩4/5, 所以反过来处理背包容量扩大5/4
dp[j] = max(dp[j], dp[j - h[i]] + v[i]);
}
int ans = dp[t];
for(int i = 1; i <= n; i++)
{
if(h[i] >= k)
{
//dp[t] = max(dp[t], dp[(t - h[i]) * 5 / 4] + v[i]); 这样写改变了dp[t],不能改变原值
//ans = max(ans, dp[t]);
ans = max(ans, dp[(t - h[i]) * 5 / 4] + v[i); //在最后枚举的时候,除去当前的大奶酪,剩下奶酪的总体积恢复正常实则为*5/4
}
}
cout << ans << endl;
return 0;
}