题目大意:n个骨头,背包体积V,n个骨头的价值以及体积。要求背包装最大价值为多少。
解题思路:最基本的01背包问题。dp[i][j]表示,在前i件物品中,选择骨头,背包价值最大。对于每块骨头,如果小于总体积可以选择放或不放dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i-1]]+value[i-1]);否则dp[i][j] = dp[i-1][j];
ac代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m, dp[1005][1005], V, v[1005], value[1005];
double temp;
int main()
{
scanf("%d", &n);
while (n--){
scanf("%d%d", &m, &V);
memset(dp, 0, sizeof(dp));
for (int i=0; i<m; i++)
scanf("%d", &value[i]);
for (int i=0; i<m; i++)
scanf("%d", &v[i]);
for (int i=1; i<=m; i++)
for (int j=0; j<=V; j++)
if (v[i-1] <= j)
dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i-1]]+value[i-1]);
else
dp[i][j] = dp[i-1][j];
printf("%d\n", dp[m][V]);
}
return 0;
}