题意:Bone收藏家有一个人容量为V的背包,请问它最多能收藏多少价值的骨头,每个骨头都有其对应的价值与容量。
链接:HDU 2602传送门
思路:01背包的经典问题,这题数据较小,不用优化也能过。用dp来解01背包问题是一种比较常规的解法。引入dp[i][j]来表示在前i个物品中选择背包容量为j时所能达到的价值的最大值。
代码:
/**01背包**/
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=1010;
int w[maxn];
int v[maxn];
int dp[maxn][maxn];
int n,m;
void slove()
{
for(int i = 1; i <= n; i++)
{
for(int j = 0; j <= m; j++)
{
if(j < w[i])///背包容量比第i个物品的重量小
dp[i][j] = dp[i-1][j];
else
dp[i][j] = max(dp[i-1][j], dp[i-1][j - w[i]] + v[i]);
cout << dp[i][j] << ' ';
}
cout << endl;
}
}
int main()
{
ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
memset(dp,0,sizeof(dp));
cin>>n>>m;
for(int i=1; i<=n; i++)
cin>>v[i];
for(int i=1; i<=n; i++)
cin>>w[i];
slove();
cout << dp[n][m] << endl;
}
return 0;
}
心得:dp想法,01背包是指对于某个物品是选择还是不选择。这就存在状态转移,动态决策问题可用dp来解决