0-1背包问题

来源:互联网 发布:一对一色情直播软件 编辑:程序博客网 时间:2024/06/05 20:49
//状态转移方程:f[i][j] = max(f[i-1][j],f[i-1][j-w[i]]+v[i])//i表示计算范围为前i个物品,j表示剩余的空间#include <iostream>using namespace std;int max(int a, int b) {return a > b ? a : b;}//分治法int knapsack(int *w,int *v,int len,int maxWeight){if(len == 1)return (w[0] <= maxWeight ? v[0] : 0);int exclude = knapsack(w,v,len-1,maxWeight);int include = 0;if(maxWeight - w[len-1] >= 0)include = knapsack(w,v,len-1,maxWeight - w[len-1]) + v[len-1];return max(exclude,include);}//动态规划int knapsackDP(int *w,int *v,int len,int maxWeight) {//分配辅助空间int **temp = new int*[len];for(int i = 0 ; i < len ;i ++) {temp[i] = new int[maxWeight+1];}for(i = 0 ; i < len ; i ++)for(int j = 0 ; j <= maxWeight; j ++)temp[i][j] = 0;for(i = 0 ; i <= maxWeight; i ++) {temp[0][i] = w[0] <= i ? v[0] : 0;}for(i = 1 ; i < len ; i ++) {for(int j = 1 ; j <= maxWeight; j ++) {if(j>=w[i])temp[i][j] = max(temp[i-1][j],temp[i-1][j-w[i]]+v[i]);elsetemp[i][j] = temp[i-1][j];}}int ret = temp[len-1][maxWeight];//释放内存for(i = 0 ; i < len ;i ++) {delete[] temp[i];}delete[] temp;return ret;}int main(){int w[] = {4,3,2,1};int v[] = {1,2,3,4};cout<<knapsack(w,v,4,4)<<endl;cout<<knapsackDP(w,v,4,4)<<endl;return 0;}

原创粉丝点击