动态规划法求解01背包问题
以下代码为动态规划法求解01背包问题并统计代码运行300遍的平均运行时间。
#include <iostream>
#include <windows.h>
#include <iomanip>
#include <time.h>
using namespace std;
int KnapSack(int w[], int v[], int n, int C){
int V[n+1][C+1];
int i, j;
int x[n+1];
for(i=0; i<=n; i++) //a[0] 到 a[n]
V[i][0] = 0; //初始化第0列
for(j=0; j<=C; j++)
V[0][j] = 0; //初始化第0行
for(i=1; i<=n; i++)
for(j=1; j<=C; j++)
if(j<w[i])
V[i][j] = V[i-1][j];
else
V[i][j] = max(V[i-1][j],V[i-1][j-w[i]]+v[i]);
for(j=C,i=n; i>0; i--){
if(V[i][j]>V[i-1][j]){
x[i]=1;
j=j-w[i];
}
else
x[i]=0;
}
return V[n][C];
}
int main()
{
LARGE_INTEGER nFreq;
LARGE_INTEGER nBeginTime;
LARGE_INTEGER nEndTime;
double time;
int w[] = {0,2,2,6,5,4};
int v[] = {0,6,3,5,4,6};
int n=5, C = 10; //5个物品,背包最大重量为10
int m;
int i=0;
double SumTime=0.0;
QueryPerformanceFrequency(&nFreq);
while(i<300){
QueryPerformanceCounter(&nBeginTime);
m = KnapSack(w,v,n,C);
QueryPerformanceCounter(&nEndTime);
time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)*1000000000/(double)(nFreq.QuadPart);
SumTime+=time;
i++;
}
time = SumTime/300.0;
cout << "Max Value is " << m << endl;
cout << "Average running time is : " << time << " ns."; //单位是纳秒.
return 0;
}