背包问题(1)

来源:互联网 发布:seo基础理论 编辑:程序博客网 时间:2024/05/24 02:18
问题描述: 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。

//时间:O(VN)空间:O(OVN)#include<iostream>#include<algorithm>using namespace std;int main(){    int goodsnum, colum;    cin >> goodsnum >> colum;    //申请数组    int *value = new int[goodsnum + 1];    int *weight = new int[goodsnum + 1];    for (int i = 1; i <= goodsnum; ++i)        cin >> weight[i] >> value[i];    int **f = new int *[goodsnum + 1];    for (int i = 0; i <= goodsnum; ++i)        f[i] = new int[colum + 1];    //初始化    for (int i = 0; i <= goodsnum; ++i)    {        for (int j = 0; j <= colum; ++j)        {            f[i][j] = 0;        }    }    //计算    for (int i = 1; i <= goodsnum; ++i)    {        for (int j = 1; j <= colum; ++j)        {            if (j >= weight[i])                f[i][j] = max(f[i - 1][j], f[i - 1][j - weight[i]] + value[i]);            else                f[i][j] = f[i - 1][j];        }        //输出        for (int j = 0; j <= colum; ++j)            cout << f[i][j] << " ";        cout << endl;    }    system("pause");    //释放空间    delete[]value;    delete[]weight;    for (int i = 0; i <= goodsnum; ++i)        delete[]f[i];    delete[]f;    return 0;}
//时间:O(VN)空间:O(V)#include<iostream>#include<algorithm>using namespace std;int main(){    int goodsnum, colum;    cin >> goodsnum >> colum;    int *value = new int[goodsnum+1];    int *weight = new int[goodsnum+1];    //输入    for (int i = 1; i <= goodsnum; ++i)        cin >> weight[i] >> value[i];    int *f = new int[colum + 1];    //初始化    for (int i = 0; i <= colum; ++i)    {        f[i] = 0;    }    for (int i = 1; i <= goodsnum; ++i)    {        //计算        for (int j = colum; j >=weight[i]; --j)        {            f[j] = max(f[j], f[j - weight[i]]+value[i]);        }        //输出        for (int j = 0; j <= colum; ++j)            cout << f[j] << " ";        cout << endl;    }    system("pause");    delete[]value;    delete[]weight;    delete[]f;    return 0;}
//时间:O(VN)空间:O(V)#include<iostream>#include<algorithm>using namespace std;//单件商品01背包过程void ZeroOnepack_goods(int cost, int value, int Colum, int *f){    for (int i = Colum; i >= cost; --i)        f[i] = max(f[i], f[i - cost] + value);}//01背包问题void ZeroOnePack(int *cost, int *value, int Num, int Colum,int *f){    for (int i = 1; i <= Num; ++i)    {        ZeroOnepack_goods(cost[i], value[i], Colum, f);    }}int main(){    int goodsnum, colum;    cin >> goodsnum >> colum;    int *value = new int[goodsnum + 1];    int *weight = new int[goodsnum + 1];    //输入    for (int i = 1; i <= goodsnum; ++i)        cin >> weight[i] >> value[i];    int *f = new int[colum + 1];    //初始化    memset(f, 0, sizeof(int)*(colum + 1));//将数组f[]全置0    ZeroOnePack(weight, value, goodsnum, colum, f);    cout << f[colum] << endl;    system("pause");    delete[]value;    delete[]weight;    delete[]f;    return 0;}
原创粉丝点击