修改于2016年5月8日 13:14
这么长时间了,终于对背包差不多了解了,这个是01背包问题,里面的最主要的还是找出状态转移方程。动态规划是运筹学的一个分支,是求解决策过程最优化的数学方案。最优化原理,把多个阶段过程转化为一系列单阶段的问题,逐个求解。它里面包含两个重要的性质——最优子结构和重叠子问题
#include <stdio.h>
// 容量是10个
void backpack_01(int *w,int *v,int (*max)[11])
{
int i = 0;
int j = 0;
for(i = 0; i <= 10; i++){
if(i >= w[0]){
max[0][i] = v[0];
}
}
for(i = 1; i < 5; i++){
for(j = 0; j <= 10; j++){
if(j > w[i] && ((max[i-1][j-w[i]] + v[i]) > max[i-1][j])){
max[i][j] = max[i-1][j-w[i]] + v[i];
}else{
max[i][j] = max[i-1][j];
}
}//end for 2
}//end for 1
}
void print_backpack_01(int (*max)[11])
{
int i = 0;
int j = 0;
for(i = 0; i < 5; i++){
for(j = 0; j <= 10; j++){
printf("%5d ",max[i][j]);
}//end for 2
printf("\n");
}//end for 1
}
int main(int argc,char *argv[])
{
int w[5] = {2,2,6,5,4};
int v[5] = {6,3,5,4,6};
int max[5][11] = {0};
backpack_01(w,v,max);
print_backpack_01(max);
return 0;
}
演示结果