作业题E/hdu3466
倒序装物品理解
状态转移方程:dp[j] = max(dp[j], dp[j - a[i].pi] + a[i].vi);
假定从后者转移而来,方程可看做满容积状态下先装了当前物品,再由之前的状态转移过来,从而可看做倒序装物品。
去除后效性理解
1.dp原理是通过记忆化枚举所有的情况,原理上跟搜索完全一致,只不过在时间上比搜索优化了太多。
2.知道原理后,那么排序就好理解一些了。
先买对钱要求低的,这要才能够保证选择到所有的情况,否则,先买花钱高的,可能会造成状态缺失,枚举不了所有的状态。
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
const int maxn = 5001;
int n, m;
int dp[maxn];
struct xiao
{
int pi, qi, vi;
}a[maxn];
bool cmp(xiao x, xiao y)
{
return x.pi - x.qi > y.pi - y.qi;
}
int main()
{
while (cin >> n >> m)
{
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; ++i)
{
cin >> a[i].pi >> a[i].qi >> a[i].vi;
}
sort(a + 1, a + 1 + n, cmp);
for (int i = 1; i <= n; ++i)
{
for (int j = m; j >= a[i].qi; j--)
{
dp[j] = max(dp[j], dp[j - a[i].pi] + a[i].vi);
}
}
cout << dp[m] << endl;
}
return 0;
}
枚举所有的情况