初始化: 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