首页 > 编程语言 > 详细

《算法十一》(背包问题)

时间:2020-02-12 23:27:21      阅读:69      评论:0      收藏:0      [点我收藏+]

问题描述:

技术分享图片

 

2.问题分析:可以知道满足一个递归式

定义:B(i, j):i代表还有几件商品可以偷

          j代表还剩下的背包空间是多少

技术分享图片

 

 例如:

  如果是B(4,20)代表:有4件商品可以偷取,背包剩余空间还有20———>一系列计算————>26

技术分享图片

 

 3.定义B数组:

技术分享图片

 

4.代码演示: 

#include <iostream>
#include <iomanip> 
#include <math.h>
#include <string.h>
#define N 6 
#define W 21 
using namespace std;
//B[i][j]:i代表还有几件商品可以偷
//		  j代表还剩下的背包空间是多少 
int B[N][W] = {0};
int w[6] = {0, 2, 3, 4, 5, 9};//重量 
int v[6] = {0, 3, 4, 5, 8, 10};//价值

void beibao(){
	int k, c;
	for(k=1; k<N; k++){//5个商品 
		for(c=1; c<W; c++){
			if(w[k]>c){//第k件商品太重超过了背包空间c,不偷 
				B[k][c] = B[k-1][c];
			}else{
				//偷第k件商品 
				int value1 = B[k-1][c-w[k]] + v[k];
				//不偷第k件商品 
				int value2 = B[k-1][c];
				B[k][c] = value1 >= value2 ? value1:value2;
			} 
		}
	}
}

int main(void){
	beibao();
	cout << B[5][20] << endl;
	return 0;
} 

《算法十一》(背包问题)

原文:https://www.cnblogs.com/Whgy/p/12301413.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!