初始化: f?0
For(i=1 to n)
{
for( j=1 to v )
{
f[i][j]=f[i-1][j];
if(j>=c[i])
{
f[i][j]=max{f[i-1][j] ,f[i-1][j-c[i]]+w[i]};
}
}
}
第一种是第i件不放进去,这时所得价值为:f[i-1][v]
第二种是第i件放进去,这时所得价值为:f[i-1][v-c[i]]+w[i]
最后比较第一种与第二种所得价值的大小,哪种相对大,f[i][v]的值就是哪种。
|
背包容量
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
|
5物品
|
0
|
0
|
0
|
0
|
0
|
0
|
6
|
12
|
12
|
15
|
15
|
18
|
22
|
22
|
25
|
25
|
|
4物品
|
0
|
0
|
3
|
3
|
3
|
3
|
3
|
12
|
12
|
15
|
15
|
18
|
22
|
22
|
25
|
25
|
|
3物品
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
12
|
12
|
15
|
15
|
15
|
22
|
22
|
22
|
22
|
|
2物品
|
0
|
0
|
0
|
0
|
3
|
12
|
12
|
12
|
12
|
15
|
15
|
15
|
15
|
15
|
15
|
15
|
|
1物品
|
0
|
0
|
0
|
0
|
0
|
12
|
12
|
12
|
12
|
12
|
12
|
12
|
12
|
12
|
12
|
12
|
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int f[6][16];
int cos[6]={0,5,4,7,2,6};
int val[6]={0,12,3,10,3,6};
memset(f,0,sizeof(f));
for(int i=1;i<=5;i++)
{
for(int j=1;j<=15;j++)
{
f[i][j]=f[i-1][j];
if(j>=cos[i])
{
f[i][j]=max(f[i-1][j],f[i-1][j-cos[i]]+val[i]);
}
}
}
for(int i=1;i<=5;i++)
{
for(int j=1;j<=15;j++)
printf("%d ",f[i][j]);
printf("\n");
}
printf("最大价值:%d\n",f[5][15]);
}
这里是用二位数组存储的,可以把空间优化,用一位数组存储!优化:将f数组转化为一维数组
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int f[16];
int cos[6]={0,5,4,7,2,6};
int val[6]={0,12,3,10,3,6};
memset(f,0,sizeof(f));
for(int i=1;i<=5;i++)
{
for(int j=15;j>=1;j--)
{
if(j>=cos[i])
{
f[j]=max(f[j],f[j-cos[i]]+val[i]);
}
}
}
for(int i=1;i<=15;i++)
{
printf("%d ",f[i]);
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/zhangxiaoxiang123/article/details/48003757