0-1背包

一、问题描述

有n个物品,他们有各自的价值与重量,现给定容量的背包,使得背包装入最大价值总和?

二、总体思路

根据动态规划找出01背包问题的最优解以及解组成,然后编写代码实现;

三、过程

第一、包的容量比该商品体积小,装不下,此时的价值与钱i-1的价值是一样的,即v(i,j)=v(i-1,j);

第二、有足够容量装该商品,但装也不一定达到当前最优价值,所以在装与不装之间选一个最大值

v(i,j)=max(v(i-1,j),v(i-1,j-w(i))+v(i));

由此可得当:

                j<w(i)         v(i,j)=v(i-1,j)

                j>=w(i)      v(i,j)=max(v(i-1,j),v(i-1,j-w(i))+v(i))

初始化边界,v(0,j)=(i,0)=0;

代码详情:

void Findmax(){
  for(int i=1;i<=number;i++){
    for(int j=1;j<=capacity;j++){
      if(j<w[i])
        v[i][j]=v[i-1][j];
      else
        v[i][j] = max(v[i-1][j],v[i-1][j-w[i]]+v[i]);
    }
  }
}

测试案列:

    number:4,capacity= 8;

input:

    4,8

    w : 2 , 3 , 4 , 5

    v : 3 , 4 , 5 , 6

output:

  10

代码实现:

    

#include <iostream>
using namespace std;
#include<cmath>
#define MAXN 120
int w[MAXN];
int v[MAXN];
int V[MAXN][MAXN];
int main() {
	int n,M;
	cin>>n>>M;
	for(int i=1;i<=n;i++){
		cin>>w[i]>>v[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=M;j++){
		    V[0][j] = V[i][0] = 0;
		    if(j<w[i])
			V[i][j] = V[i-1][j];
		    else
			V[i][j] = max(V[i-1][j],V[i-1][j-w[i]]+v[i]);
		}
	}
	cout<<V[n][M]<<endl;
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值