01背包问题

来源:互联网 发布:excel表格怎么数据统计 编辑:程序博客网 时间:2024/06/07 04:55

//01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }
//f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。
//Pi表示第i件物品的价值。
//决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中吗 ?

#include <iostream>#include <vector>#include <algorithm>using namespace std;int dp(vector<int> weights, vector<int>value, int bag){    int row, col;    row = weights.size() - 1;    col = bag;    vector<vector<int>> res(row + 1, vector<int>(col + 1, 0));    for (int i = 1; i <= row; i++)        for (int j = 1; j <= col; j++)        {            if (weights[i] <= j)                res[i][j] = max(res[i - 1][j], res[i - 1][j - weights[i]] + value[i]); //res[i][j]表示把i件物品放进承受力为j的背包的最大价值            else                res[i][j] = res[i - 1][j];        }    return res[row][col];}int main(){    int n, m;    cin >> n >> m;    vector<int> weights;    weights.push_back(0);    vector<int> value;    value.push_back(0);    for (int i = 0; i < n; i++)    {        int num, val;        cin >> num >> val;        weights.push_back(num);        value.push_back(val);    }    cout << dp(weights, value, m) << endl;    system("pause");    return 0;}

扩展

一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。
输入描述:
输入包括两行:
第一行为整数n(1 ≤ n ≤ 50)
第二行为n个整数length[i](1024 ≤ length[i] ≤ 4194304),表示每个任务的长度为length[i]kb,每个数均为1024的倍数。

输出描述:
输出一个整数,表示最少需要处理的时间

输入例子1:
5
3072 3072 7168 3072 1024

输出例子1:
9216

#include <iostream>#include <vector>#include <algorithm>using namespace std;int dp(vector<int> weights, int bag){    int row, col;    row = weights.size() - 1;    col = bag;    vector<vector<int>> res(row + 1, vector<int>(col + 1, 0));    for (int i = 1; i <= row; i++)        for (int j = 1; j <= col; j++)        {            if (weights[i] <= j)                res[i][j] = max(res[i - 1][j], res[i - 1][j - weights[i]] + weights[i]); //res[i][j]表示把i件物品放进承受力为j的背包的最大价值            else                res[i][j] = res[i - 1][j];        }    return res[row][col];}int main(){    int n;    cin >> n;    vector<int> weights;    weights.push_back(0);    int sum = 0;    for (int i = 0; i < n; i++)    {        int num;        cin >> num;        weights.push_back(num / 1024);        sum += num / 1024;    }    int half = sum / 2;//转换成01背包问题    cout << (sum- dp(weights, half)) * 1024 << endl;    system("pause");    return 0;}
原创粉丝点击