最近研究了一下0-1背包问题,题目就不复述了,大家应该都知道的。
确切的说不是三种解法而是四种解法,下面我就一一写来。
0.枚举法
这种是最简单的一种做法,当然也是时间空间复杂度最大的方法,得到的肯定是精确的结果。若有k个背包,则只要变量2^k次方即可,程序如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#include <stdio.h>
#include <stdlib.h>
int
main()
{
int
ca;
int
mi(
int
,
int
);
int
m,c,cao=0;
int
weight[10],value[10];
int
i,k,valuemax[100]={0},wei,val;
int
x[10];
scanf
(
"%d%d"
,&m,&c);
k=0;
while
(m>0||c>0)
{
valuemax[cao]=0;
for
(i=0;i<m;i++)
scanf
(
"%d"
,&weight[i]);
for
(i=0;i<m;i++)
scanf
(
"%d"
,&value[i]);
for
(i=0;i<mi(2,m);i++)
{
wei=0;
val=0;
ca=i;
for
(k=0;k<m;k++)
{
x[k]=i%2;
i=i/2;
wei+=x[k]*weight[k];
val+=x[k]*value[k];
// k++;
}
if
(wei<=c&&val>=valuemax[cao])
valuemax[cao]=val;
i=ca;
}
cao++;
scanf
(
"%d%d"
,&m,&c);
}
for
(i=0;i<cao;i++)
printf
(
"%d\n"
,valuemax[i]);
return
0;
}
int
mi(
int
m,
int
n)
{
int
sum=1,i;
for
(i=0;i<n;i++)
sum=sum*m;
return
sum;
|