大家好,精选小编来为大家解答以上问题。c语言背包问题原理,c语言背包问题很多人还不知道,现在让我们一起来看看吧!
1、 首先打开VC 6.0
2、 选择文件,新建
3、 选择c源文件新建一个空白文档
4、 首先声明头文件和常量
5、 # includestdio.h
6、 #定义编号10/*定义物品总数*/
7、 #定义内容10 /*定义包的容量*/
8、 写一个函数,用来得到多个最优解
9、 空的背包(int v[数字],int w[数字],int c,int m[数字][内容])
10、 {
11、 int n=NUM-1;
12、 int i,j;
13、 int jMax
14、 if((w[n]-1) c)
15、 jMax=w[n]-1;
16、 其他
17、 jMax=c;
18、 /* 初始化m[n][j] */
19、 for(j=0;j=jMaxj)
20、 m[n][j]=0;
21、 for(j=jMax 1;j=c;j)
22、 m[n][j]=v[n];
23、 /*使用非递归的算法来求解m[i][j] */
24、 for(I=n-1;I 0;我-)
25、 {
26、 if((w[i]-1) c)
27、 jMax=w[I]-1;
28、 其他
29、 jMax=c;
30、 for(j=0;j=jMaxj)
31、 m[I][j]=m[I 1][j];
32、 for(j=jMax 1;j=c;j)
33、 {
34、 if(m[i 1][j]=(m[i 1][j-w[i]] v[i]))
35、 m[I][j]=m[I 1][j];
36、 其他
37、 m[I][j]=m[I 1][j-w[I]]v[I];
38、 }
39、 }
40、 if(cw[0])
41、 {
42、 if(m[1][c]=(m[1][c-w[0]] v[0]))
43、 m[0][c]=m[1][c];
44、 其他
45、 m[0][c]=m[1][c-w[0]]v[0];
46、 }
47、 其他
48、 m[0][c]=m[1][c];
49、 }
50、 再编写一个函数,用来寻找最优解
51、 /*寻找最优解*/
52、 void追溯(int标志[数字],int w[数字],int m[数字][内容])
53、 {
54、 int n=NUM-1;
55、 int I;
56、 int c=内容;
57、 for(I=0;I n;我)
58、 {
59、 if(m[i][c]==m[i 1][c])
60、 flag[I]=0;
61、 其他
62、 {
63、 flag[I]=1;
64、 c-=w[I];
65、 }
66、 }
67、 if(m[n][c] 0)
68、 flag[n]=1;
69、 其他
70、 flag[n]=0;
71、 }
72、 写个函数,用来输出最优解
73、 void printResult(int flag[NUM],int w[NUM],int v[NUM],int m[NUM][CONTENT])
74、 {
75、 int I;
76、 printf('背包应该包含:\ n’);
77、 printf('数量重量值\ n’);
78、 for(I=0;我编号我)
79、 {
80、 if(flag[i]==1)
81、 printf(' %d %d %d\n ',I,w[i],v[I]);
82、 }
83、 printf('背包中最大值为:%d\n ',m[0][内容]);
84、 }
85、 主函数
86、 int main()
87、 {
88、 int value[NUM]={5,2,3,4,3,6,5,7,8,2 };
89、 int weight[NUM]={2,1,3,2,4,3,5,6,2,2 };
90、 int c=内容;
91、 int max value[NUM][CONTENT];
92、 int flag[NUM]={0,0,0,0,0,0,0,0 };
93、 printf(' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ');
94、 printf('*此程序将求解* \ n ');
95、 printf(* 0-1 napsack的问题* \ n ');
96、 printf(' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ');
97、 /*计算最优值*/
98、 背包(值,重量,c,最大值);
99、 /*构造最优解*/
100、 追溯(标志、权重、最大值);
101、 /*打印程序的结果*/
102、 打印结果(标志、权重、值、最大值);
103、 getch();
104、 返回0;
105、 }
106、 运行结果
本文到此结束,希望对大家有所帮助。