/*
*背包问题之动态规划解法结合营养套餐问题
*author cg
*date 2008 12 26
/
#include "stdio.h"
#define N 6 /*定义食物数量*/
#define S 100 /*最大营养大小*/
int main() {
int p[N] = {100,22,80,25,10};/*测试数据表示价格*/
int w[N] = {50,30,51,12,5};/*测试数据表示营养*/
int f[ N + 1 ][ N + 1];/*动态价格营养关系数组*/
int result = 0;/*要求的结果*/
int x[ N ] = {0};/*定义解数组*/
int i,j;/*定义计数器*/
int temp;
for (j = 0; j < S+1; j++)
f[N][j] = 0;/*初始化*/
for (j = w[N]; j <= S; j++)
f[N][j] = p[N];/*初始化价格*/
for(i = N-1; i > 1; i--) {
for(j = 0; j < S+1; j++)
f[i][j] = f[i+1][j];
for(j = w[i]; j <= S; j++){
f[i][j] =
f[i+1][j] > f[i+1][j-w[i]] + p[i] ?
f[i+1][j] : f[i+1][j-w[i]] + p[i];/*判断是否是最大的值,否则保持*/
}/*for*/
}/*for*/
f[1][S] = f[2][S];
if (S >= w[1])
f[1][S] =
f[1][S] > f[2][S-w[1]] + p[1] ?
f[1][S] : f[2][S-w[1]] + p[1];/*处理最终结果*/
temp= f[1][S];
for (i = 1; i < N; i++){/*解数组*/
if (f[i][S] == f[i+1][S])
x[i] = 0;
else {
x[i] = 1;
temp-= w[i];/*减去已经添加的营养*/
}/*else*/
}/*for*/
x[N] = f[N][S] ? 1 : 0;
result = f[1][S];
printf("best is %dn", result);/*输出最大的结果*/
for (i = 1; i <= N ; i++) {/*逐个输出结果*/
if (x[i] == 1) {
printf(" the p: %d", p[i]);
printf(" the w: %dn", w[i]);
}/*if*/
}/*for*/
system("pause");
return 0;
}
/*
*背包问题之动态规划解法结合营养套餐问题
*author cg
*date 2008 12 26
/
#include "stdio.h"
#define N 6 /*定义食物数量*/
#define S 100 /*最大营养大小*/
int main() {
int p[N] = {100,22,80,25,10};/*测试数据表示价格*/
int w[N] = {50,30,51,12,5};/*测试数据表示营养*/
int f[ N + 1 ][ N + 1];/*动态价格营养关系数组*/
int result = 0;/*要求的结果*/
int x[ N ] = {0};/*定义解数组*/
int i,j;/*定义计数器*/
int temp;
for (j = 0; j < S+1; j++)
f[N][j] = 0;/*初始化*/
for (j = w[N]; j <= S; j++)
f[N][j] = p[N];/*初始化价格*/
for(i = N-1; i > 1; i--) {
for(j = 0; j < S+1; j++)
f[i][j] = f[i+1][j];
for(j = w[i]; j <= S; j++){
f[i][j] =
f[i+1][j] > f[i+1][j-w[i]] + p[i] ?
f[i+1][j] : f[i+1][j-w[i]] + p[i];/*判断是否是最大的值,否则保持*/
}/*for*/
}/*for*/
f[1][S] = f[2][S];
if (S >= w[1])
f[1][S] =
f[1][S] > f[2][S-w[1]] + p[1] ?
f[1][S] : f[2][S-w[1]] + p[1];/*处理最终结果*/
temp= f[1][S];
for (i = 1; i < N; i++){/*解数组*/
if (f[i][S] == f[i+1][S])
x[i] = 0;
else {
x[i] = 1;
temp-= w[i];/*减去已经添加的营养*/
}/*else*/
}/*for*/
x[N] = f[N][S] ? 1 : 0;
result = f[1][S];
printf("best is %dn", result);/*输出最大的结果*/
for (i = 1; i <= N ; i++) {/*逐个输出结果*/
if (x[i] == 1) {
printf(" the p: %d", p[i]);
printf(" the w: %dn", w[i]);
}/*if*/
}/*for*/
system("pause");
return 0;
}