动态规划_0-1背包问题
0-1背包问题是一个经典的问题,可以用动态规划以线性的时间解决,相比于蛮力求解,动态规划的各项性能都比较好。关于0-1背包问题的具体解释请见下面这篇博客:
http://www.cnblogs.com/Christal-R/p/Dynamic_programming.html
这篇博客对0-1背包问题的分析很透彻,也提出了自己的改进算法,我就不做具体论述,我借鉴其中的思想,写下一下代码
#include<iostream>
#include<cmath>
#include<algorithm>
#include<utility> //为返回两个一维数组,使用pair
using namespace std;
int number; //商品个数
int capacity; //背包容量
int* item = new int[number + 1];
pair<int*, int*> Create()
{
int* w = new int[number + 1];
int* v = new int[number + 1];
for (int i = 1; i <= number; i++)
{
w[i] = i + 1;
v[i] = i + 2;
}
pair<int*, int*> result(w, v);
return result;
}
int** Knapsack_Problem( pair<int*, int*> result)
{
int** V = new int*[number + 1];
for (int z = 0; z <= number; z++)
V[z] = new int[capacity + 1];
for (int x = 0; x <= number; x++)
V[x][0] = 0;
for (int y = 0; y <= capacity; y++)
V[0][y] = 0;
int i, j;
for(int i = 1;i<=number; i++)
{
for (j = 1; j <= capacity; j++)
{
if (j < result.first[i]) //装不下
{
V[i][j] = V[i - 1][j];
}
else //装的下
{
V[i][j] = max(V[i - 1][j],V[i - 1][j - result.first[i]] + result.second[i]);
}
}
}
return V;
}
void FindWhat(int i,int j,int** V,int* item, pair<int*, int*> result)
{
if (i > 0 && j>0)
{
if (V[i][j] == V[i - 1][j])//相等说明没装
{
item[i] = 0;//全局变量,标记未被选中
FindWhat(i - 1, j,V, item, result);
}
else if (j - result.first[i] >= 0 && V[i][j] == V[i - 1][j - result.first[i]] + result.second[i])
{
item[i] = 1;//标记已被选中
FindWhat(i - 1,j- result.first[i], V, item, result);//回到装包之前的位置
}
}
}
void printf(int* item)
{
for (int i = 0; i <= number; i++)
{
if (item[i] == 1)
{
cout << i << "号" << "\t";
}
}
cout << endl;
}
int main()
{
cout << "plase enter the number of goods: " << endl;
cin >> number;
cout << "plase enter the capacity of knapsack: " << endl;
cin >> capacity;
pair<int*, int*> result = Create();
int** V = Knapsack_Problem(result);
for (int i = 0; i <= number; i++)
{
for (int j = 0; j <= capacity; j++)
{
cout << V[i][j] << "\t";
}
cout << endl;
}
for (int i = 0; i <= number; i++)
{
item[i] = 0;
}
FindWhat(number, capacity, V, item, result);
cout << "最大价值为" << V[number][capacity] << endl;
cout << "商品号码为" << endl;
printf(item);
return 0;
}
动态规划算法在很多问题上都有很好的应用,理解其中的原来至关重要
夜深了,你在哪里
浙公网安备 33010602011771号