01背包问题 C++

原文地址http://blog.csdn.net/mu399/article/details/7722810

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<math.h>
#include<algorithm>
#include<vector>

using namespace std;

//动态规划 之 01背包问题
class PackageItem
{
public:
    char name;
    int weight;
    int value;
    PackageItem(char n,int w,int v):name(n),weight(w),value(v){};
    PackageItem(){};
};

char namearray[] = {'a','b','c','d','e'};
int weightarray[] = {2,2,6,5,4};
int valuearray[] = {6,3,5,4,6};

int get01PackageAnswer(PackageItem* bagItems,int itemsize, int bagsize, vector<char> &answer)
{
    int i,j;
    int **bagMatrix = new int*[itemsize];
    for(i = 0; i < itemsize; i++)
        bagMatrix[i] = new int[bagsize+1];
    PackageItem item;
    for(i = 1; i <= bagsize; i ++)
    {
        for(j = 0 ; j < itemsize; j++)
        {
            item = bagItems[j];

            if(item.weight > i)  //此时容量为i的背包装不下第 j个物品
            {
                if(j == 0)
                    bagMatrix[j][i] = 0;
                else
                    bagMatrix[j][i] = bagMatrix[j-1][i]; 
            }
            else   //将第j个物品装入背包
            {
                if(j == 0)
                {
                    bagMatrix[j][i] = item.value;
                }
                else
                {
                    int compvalue = bagMatrix[j-1][i - item.weight] + item.value;
                    bagMatrix[j][i] = max(compvalue,bagMatrix[j-1][i]) ;
                }

            }
        }

    }
    for(i = 0 ; i < itemsize; i++)
        {
            for(j = 1; j < bagsize+1 ; j++)
                cout<< bagMatrix[i][j]<<" ";
            cout<<endl;
        }

    int cursize = bagsize;
    for(i = itemsize -1 ;i >= 0; i --)
    {
        item = bagItems[i];
        if(cursize == 0)
            break;
        if(i == 0 && cursize > 0)  //考虑到背包大小 有容余  并且  i = 0时 ,i-1会越界
        {
            answer.push_back(item.name);
            break;
        }
        if(curval > task[i])
        {
            if(bagMatrix[i][cursize] - bagMatrix[i-1][cursize - item.weight] == item.value)
            {
                answer.push_back(item.name);
                cursize -= item.weight;
            }
        }
    }


    return bagMatrix[itemsize - 1][bagsize];
}




void main()
{
    int leng = sizeof(namearray)/sizeof(char);
    PackageItem* bagItems = new PackageItem[leng];  //创建数组必须要用默认构造函数
    int i;
    for(i = 0; i < leng ; i++)
    {
        PackageItem bag(namearray[i],weightarray[i],valuearray[i]);
        bagItems[i] = bag ;
    }
    vector<char> ans;
    int va = 0;
    va = get01PackageAnswer(bagItems,leng,10,ans);
    system("pause");
}

//网易 2017笔试 :双核CPU同时处理 多个任务,每个CPU一次处理一个任务 ; 每个任务大小都是1kb的倍数,问最短需要多久处理完
// 输入任务个数n:5 ; 1 <= n <= 50
//每个任务大小:3072 3072 7168 3072 1024 1024<=length[i]<=419430
//输出处理时间: 9216

void main()
{
    int n = 5;
    int task[] = {3072,3072,7168,3072,1024};
    int bagsize = 0;
    for(int i = 0 ;i < n ;i ++)
    {
        task[i] = task[i]/1024;
        bagsize += task[i];
    }
    int totalsize = bagsize;
    bagsize /= 2.0;

    int cursize;
    int i,j;
    vector<vector<int>> bagMatrix(n,vector<int> (bagsize + 1));

    for(i = 0; i < n; i++)
    {
        for(j = 1; j <= bagsize; j++)
        {
            if(task[i] > j)
            {
                if(i == 0)
                {
                    bagMatrix[i][j] = 0;
                }
                else
                {
                    bagMatrix[i][j] = bagMatrix[i-1][j];
                }
            }
            else
            {
                if(i == 0)
                {
                    bagMatrix[i][j] = task[i];
                }
                else
                {
                    int comval = bagMatrix[i-1][j - task[i]] + task[i];
                    bagMatrix[i][j] = max(comval,bagMatrix[i-1][j]);
                }
            }
        }
    }
    int curval = bagMatrix[n-1][bagsize];

    vector<int> itemcomb;
    for(i = n - 1 ; i >= 0; i--)
    {
        if(curval == 0)
            break;
        if(i == 0 && curval > 0)
        {
            itemcomb.push_back(i);
            break;
        }
        if(curval > task[i])
            if(bagMatrix[i][curval] - bagMatrix[i-1][curval - task[i]] == task[i])
            {
                itemcomb.push_back(i);
                curval -= task[i];
            }
    }



    int newval = bagMatrix[n-1][bagsize];
    int  val = max(newval,(totalsize - newval)) *1024;
    cout<< val;
    system("pause");

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值