2018_蓝桥_动态规划_0/1背包总结

.

0/1背包问题:  给定容量V的背包,现在有多个物品要放入背包,每个物品有一定的体积和价值,要求在背包可以放下的情                                    况下放入的物品的总价值最大(下面给的装箱问题其实也一样的,求总空间最小,其实可以理解为求装入的物品的体积最大化,那么把物品的价值赋值为体积,求体积最大也就是求价值最大!)!

部分背包问题):贪心

    对于部分背包问题,因为物品可以放一部分,而不是必须整体放入。所以可以直接用贪心算法是可以直接解出来的。什么是贪心算法?通俗地讲就是选择的每一步都是最优的。

全部背包问题):动态规划

    对于全部背包问题举例:  算法训练 装箱问题点击打开链接

    

  算法训练 装箱问题  
时间限制:1.0s   内存限制:256.0MB
      
问题描述
  有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
  要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入格式
  第一行为一个整数,表示箱子容量;
  第二行为一个整数,表示有n个物品;
  接下来n行,每行一个整数表示这n个物品的各自体积。
输出格式
  一个整数,表示箱子剩余空间。
   样例输入
  24
  6
  8
  3
  12
  7
  9
  7
样例输出
0

    

//全部背包问题
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<iomanip>
using namespace std;
int Volume[30]; int Need[30];//容量和需求度(价值)数组
int cache[40000][30];//刚好写成20000就出错了
int Package(int capacity,int item) {//capacity容量
	if (item==-1) {//边界条件
		return 0;//返回0
	}
	int &ret = cache[capacity][item];//动态规划固定的写法
	if (ret!=0) {
		return ret;
	}
	//不放入
	ret=Package(capacity, item - 1);
	//放入(忘记考虑容量这个条件了)
	if (capacity>=Volume[item]) {
		ret = max(ret, Package(capacity - Volume[item], item - 1) + Need[item]);
	}
	return ret;
}
int main() {
	int ca,n;//箱子容量和物品数目
		cin >> ca>>n;
		for (int i = 0; i < n;i++) {
			cin >> Volume[i];
			Need[i] = Volume[i];
		}
		cout << ca-Package(ca,n-1) << endl;
	return 0;
}

.

选法应该是2^n次方(即每个物品都是选或者不选的区别)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

八块腹肌的小胖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值