背包问题 动态规划 c语言,[算法]背包问题的动态规划算法解答,C语言实现

/*

*背包问题之动态规划解法结合营养套餐问题

*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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值