动态规划算法 01背包问题(单解) 源码加测试数据

#include
#include "stdio.h"

#define N 20
#define M 1024*1024
struct object
{
int n;//物品的编号
int w;//物品的重量
int v;//物品的价值
}wup;
struct object wp[N]; //物品的数组,N为物品的个数




#define C 300 //最大价值
int V[N+1][C+1];
int x[N];
int KnapSack(int n, int w[ ], int v[ ]);
int max(int x,int y);
int count=0;

int main()
{
int w[N]={0};
int v[N]={0};
int i=0;
FILE *fp;/*文件指针*/

//获取测试数据
if((fp=fopen("111.txt","r+"))==NULL)
{
printf("cannot open the file!");
exit(0);
}
//读取文件
for(i=0;i{
fscanf(fp,"%d%d%d",&wp[i].n,&wp[i].w,&wp[i].v);
}

for(i=0;i{
printf("%3d-%3d,%3d\n",wp[i].n,wp[i].w,wp[i].v);
}

//把背包值付给运算过程数据
for(i=0;i{w[i]=wp[i].w;
v[i]=wp[i].v;

}




printf("背包获得的最大价值是:%d \n",KnapSack(N,w,v));
printf("装入背包的物品是:");


for(i=0;iif (x[i] == 1) printf("%d-",i+1);

printf("\n");
printf("循环次数为:%d\n",count);
return 0;
}
int max(int x,int y)
{
if (x > y) return x;
else return y;
}
int KnapSack(int n, int w[ ], int v[ ])
{
int i, j;
for (i = 0; i <= n; i++) //初始化第0列
V[i][0] = 0;
for (j = 1; j <= C; j++) //初始化第0行
V[0][j] = 0;
for (i = 1; i <= n; i++) //计算第i行,进行第i次迭代
{
for (j = 1; j <= C; j++)
{
if (j < w[i-1]) V[i][j] = V[i-1][j];
else V[i][j] = max(V[i-1][j], V[i-1][j-w[i-1]]+v[i-1]);
count++;
}
}
for (j = C, i = n; i > 0; i--) //求装入背包的物品
{
if (V[i][j] > V[i-1][j]) {
x[i-1] = 1; j = j - w[i-1];
}
else x[i-1] = 0;
}


return V[n][C]; //返回背包取得的最大价值
}


//测试数据
1 71 26
2 34 59
3 82 30
4 23 19
5 1 66
6 88 85
7 12 94
8 57 8
9 10 3
10 68 44
11 5 5
12 33 1
13 37 41
14 69 82
15 98 76
16 24 1
17 26 12
18 83 81
19 16 73
20 26 32
21 18 74
22 43 54
23 52 62
24 71 41
25 22 19
26 65 10
27 68 65
28 8 53
29 40 56
30 40 53
31 24 70
32 72 66
33 16 58
34 34 22
35 10 72
36 19 33
37 28 96
38 13 88
39 34 68
40 98 45
41 29 44
42 31 61
43 79 78
44 33 78
45 60 6
46 74 66
47 44 11
48 56 59
49 54 83
50 17 48



相关文档
最新文档