题目链接:点击打开链接。
这是经典的背包问题,但是对于菜鸟的我真是特别难。
dp[j] = max(dp[j], dp[j - w] + v)这个状态转移方程我能写出来,但是问题是游戏的bug,这就让背包的容量不定了,我卡这儿百思不得其解。
到底在取最后一个时怎么找到剩下的价值最大的物品?
突然我想起来不用管这些,反正你从前往后推就好了,保证每种可能性过一遍,dp只会保存最大值。
#include <bits/stdc++.h>
using namespace std;
struct things//物品
{
int w;//重量
int v;//价值
};
bool cmp(things a, things b)
{
if(a.w != b.w)
return a.w < b.w;
else
return a.v < b.v;
}
things a[1000];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);//加速cin,cout。
int n, m, h;
int dp[2000] = {0};
int ans;
while(cin >> n && n)
{
ans = -1;
cin >> m >> h;
fill(dp, dp + 2000, 0);
for(int i = 0; i < n; i++){
cin >> a[i].w >> a[i].v;
}
sort(a, a + n, cmp);
for(int i = 0; i < n; i++){
int w = a[i].w, v = a[i].v;
//这里确定dp的上限
int maxv = ((h == 0)?m:(m + h - 1 + w));
for(int j = maxv; j >= w; j--){
dp[j] = max(dp[j], dp[j - w] + v);
}
}
for(int i = 0; i < 500; i++)
if(dp[i] > ans)
ans = dp[i];
cout << ans << endl;
}
return 0;
}
|
|
|
|
|