Knapsack-Dynamic Programming

来源:互联网 发布:淘宝那里设置破损补寄 编辑:程序博客网 时间:2024/05/21 11:33
#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;}


0 0
原创粉丝点击