关于【01背包问题】的思考

#include <stdio.h>


/***
数组w:代表物品的不同重量
数组v:代表物品的不同价值
数组w和v一一对应,即w[i]重量的商品价值是v[i]

bp表示背包的最大装载物品的重量

***/
static int w[5]= {3,5,1,7,9};
static int v[5]= {10,2,9,15,30};
static int bp=10;


int main() {
/***
初始化二维数组board,大小和bp与w数组有关,用来存储每一步动态规划的出来的计算结果
数组每一行代表一个物品的重量
数组每一列下标代表当前背包的装载重量,数组最大下标就表示背包的最大要求容量 
***/
	int board[5][11];
	for(int n=0; n<5; n++) {
		for(int m=0; m<12; m++) {
			board[n][m]=0;
		}
	}

/***
01背包问题公式
board[i][j]=max{board[i-1][j],v[i]+board[i-1][j-w[i]]}
 
board[i][j]表示当前状态最大价值 

***/
	for(int ii=0; ii<5; ii++) {
		for(int jj=0; jj<11; jj++) {
			int i=ii,j=jj;
			if(i==0) {
				if(w[i]<=j)
					board[i][j]=v[i];
			} else {
				if(w[i]<=j&&v[i]+board[i-1][j-w[i]]>=board[i-1][j]) {
					board[i][j]=v[i]+board[i-1][j-w[i]];
				} else {
					board[i][j]=board[i-1][j];
				}
			}
		}
	}


	for(int n=0; n<5; n++) {
		for(int m=0; m<11; m++) {
			printf("%d  ",board[n][m]);
		}
		printf("\n");
	}


}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值