Knapsack-Dynamic Programming

21 篇文章 0 订阅
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>

using namespace std;

typedef struct
{
    int v;
    int w;
} Item;


int Knapsack(vector<Item> &items, int size, int numItems)
{
	int** A = new int*[numItems+1];
    for(int i=0;i<numItems+1; i++)
        A[i] = new int[size+1];
    // -------- Initial ------
    for(int j=0; j<size+1; j++)
        A[0][j] = 0;
	/* for(int i=0; i<numItems+1; i++)
	A[i][0] = 0;*/
    //
	int prew;
    for(int i=1; i<numItems+1; i++)
        for(int j=0; j<size+1; j++)
		{
			A[i][j] = max(A[i-1][j], j-items[i-1].w>=0?A[i-1][j-items[i-1].w]+items[i-1].v:0);
		}

	int v = A[numItems][size];
	delete []A;
    return v;
}

int main()
{
    ifstream infile;
    infile.open("knapsack_big.txt", ifstream::binary);

    // ---------------------
    string line;
    stringstream ss;
    getline(infile, line);
    ss << line;

    int knapsack_size;
    int item_num;
    ss >> knapsack_size >> item_num;
    // -------- Initialize ---------
    vector<Item> items(item_num);
	int ttt;
	int tt;
    for(int i=0; i<item_num; i++)
    {
		ss.clear();
		line.clear(); 
        getline(infile, line);
        ss << line;
		
		ss >> items[i].v;
		ss >> items[i].w;     
    }
    infile.close();
    // -------------------------
    
    int v = Knapsack(items, knapsack_size, item_num);
    cout << v << endl;
    return 0;

}


利用在计算A的矩阵时,交换顺序和只利用两行信息的特点,可以只需要2*size的内存空间即可:


#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <algorithm>

using namespace std;

typedef struct
{
    int v;
    int w;
} Item;


int FastKnapsack(vector<Item> &items, int size, int numItems)
{
	// ---- Initial -----------
	int ** A = new int*[2];
	for (int i=0; i<2; i++)
		A[i] = new int[size+1];

	for (int j=0; j<size+1; j++)
		A[0][j] = 0;

	// -----------------------
	for (int i=1; i<numItems+1; i++)
	{
		if (1 == i%2)
		{
			for (int j=1; j<size+1; j++)
			{
				A[1][j] = max(A[0][j], j-items[i-1].w>=0?A[0][j-items[i-1].w]+items[i-1].v:0);
			}
			
		}else
		{
			for (int j=1; j<size+1; j++)
			{
				A[0][j] = max(A[1][j], j-items[i-1].w>=0?A[1][j-items[i-1].w]+items[i-1].v:0);
			}
		}
	}

	int v = max(A[0][size], A[1][size]);
	delete []A;
    return v;
}



int main()
{
    ifstream infile;
    infile.open("knapsack_big.txt", ifstream::binary);

    // ---------------------
    string line;
    stringstream ss;
    getline(infile, line);
    ss << line;

    int knapsack_size;
    int item_num;
    ss >> knapsack_size >> item_num;
    // -------- Initialize ---------
    vector<Item> items(item_num);
    for(int i=0; i<item_num; i++)
    {
		ss.clear();
		line.clear(); 
        getline(infile, line);
        ss << line;
		
		ss >> items[i].v;
		ss >> items[i].w;     
    }
    infile.close();
    // -------------------------
    int v = FastKnapsack(items, knapsack_size, item_num);
	

    cout << v << endl;
    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值