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
- Knapsack-Dynamic Programming
- dynamic programming --knapsack problem 背包问题(c++实现)
- 动态规划 (Dynamic Programming) 之 背包问题合辑 (Knapsack, Subset Sum, Partition and change making problem )
- 动态规划 (Dynamic Programming) 之 背包问题合辑 (Knapsack, Subset Sum, Partition and change making problem )
- dynamic programming
- Dynamic Programming
- Dynamic Programming
- dynamic programming
- Dynamic Programming
- dynamic programming
- Dynamic Programming
- Dynamic Programming
- Dynamic Programming
- Dynamic Programming
- Dynamic programming
- Dynamic Programming
- Dynamic Programming
- Dynamic Programming
- RMAN-08137: WARNING: archived log not deleted, needed for standby or upstream capture process .
- DDMS中data打不开
- android开发基本知识点
- 构造方法(初学者求教)
- 机房重构---准备阶段总结
- Knapsack-Dynamic Programming
- Context
- Blocks一些特性介绍
- OC 类中带参数的方法和匿名对象
- JAVA中||与|,&&与&的区别
- KVC 与 KVO 理解
- 让我们一起努力吧~
- android 动态加载jar/dex文件
- 这世界我曾经来过--童年