从第二天开始每天加 x 块钱。
一共 m 天,每天都有一个商品,价格 c[ i ],价值 h[ i ]。
问最后最多买多少h。
本题就是在01背包上限制了个我们有的钱数。那这怎么办呢?
其实我们可以问题分离,先把所有最优状态求出来,然后检查是否可行即可。
dp[ i ] 表示 购买价值到 i 时,消耗的最少钱数。
那么 i - h[ j ] 就是买这个商品 j 前的总价值 ,dp[ i - h[ j ] ]就是已经花的钱,而总钱数我们是可以根据天数 j * 工资 x 来求出 , 那么就足以判断在这个状态下是否有足够钱可以购买这个商品了。
#define int long long
int c[maxn];
int h[maxn];
int m, x;
int dp[50005];
void solve()
{
cin >> m >> x;
int sumh = 0;
for (int i = 1; i <= m; i++)
{
cin >> c[i] >> h[i];
sumh += h[i];
}
for (int i = 1; i <= sumh; i++)
dp[i] = 5e9 + 5;
for (int j = 1; j <= m; j++)
{
for (int i = sumh; i >= 0; i--)
{
if (i - h[j] >= 0&& (j-1)*x - dp[i-h[j]] >= c[j])//此时可以检查钱数
{
dp[i] = min(dp[i - h[j]] + c[j],dp[i]);
}
}
}
for (int i = sumh; i >= 0; i--)
{
if (dp[i] <= 5e9)
{
cout << i << endl;
return;
}
}
cout << -1 << endl;
}