HDU 2602 Bone Collector (01背包)

来源:互联网 发布:悉尼大学平均分算法 编辑:程序博客网 时间:2024/06/06 08:46

描述

给n块质量为c[i]价值为v[i]的骨头和一个可容纳V大小的背包,如何选择骨头使得价值最大。

Sample Input

1
5 10
1 2 3 4 5
5 4 3 2 1

Sample Output

14

Solution

使用一个滚动数组实现
1. 注意价值数组,重量数组,dp数组的范围
2. 上述三个数组的 memset 很重要
3. 一维滚动数组循环格式为 for (int i = 0; i < n; i++) for (int j = v; j >= volume[i]; j--)
4. 最后一个元素为dp[weight]

#include <iostream>#include <algorithm>#include <cstring>using namespace std;int value[1005] = {0};int volume[1005] = {0};int dp[1000005] = {0};int main(){    int T;    cin >> T;    while (T--)    {        memset(value, 0, sizeof(value));        memset(volume, 0, sizeof(volume));        memset(dp, 0, sizeof(dp));        int n, v;        cin >> n >> v;        for (int i = 0; i < n; i++)        {            cin >> value[i];        }        for (int i = 0; i < n; i++)        {            cin >> volume[i];        }        for (int i = 0; i < n; i++)        {            for (int j = v; j >= volume[i]; j--)            {                dp[j] = max(dp[j], dp[j - volume[i]] + value[i]);            }        }        cout << dp[v] << endl;    }    return 0;}