C++ 01背包

01背包

哈喽啊!这是我的第—篇讲解(^o^)/~

谢谢你能点开我的一文不值的讲解(๑′ᴗ‵๑)

蒟蒻不才,还望大佬多多指教 ……

(此处省略∞字)

—————————————————————————————————

一.例题选择

信息学奥赛一本通

这个题库来讲,首推 1267:【例9.11】01背包问题 ,以及1290:采药

洛谷

emmm…,可以选择做一下 P1048 [NOIP2005 普及组] 采药(其实与一本通1290一样),和 P1616 疯狂的采药

再其他的题库就自己去探索吧!(原因是我懒得找)

二.基本思路+要点归纳

1.特点: 每种物品仅有一件,可以选择不放

2.状态定义:f[i][v]=前i件物品 (部分或全部) 正好放入一个容量为v的背包中可以获取的最大价值

3.状态转移方程:所以,01背包的状态转移方程便是:

f[i][v]=max(f[i-1][v],f[i-1][v-w[i]]+c[i])

{   

对于该式的解读如下图:

}

三.基础代码

代码十分简练 (我参考数据与 1267:【例9.11】01背包问题):

#include<iostream>
#include<cstdio>
using namespace std;
const int N=35,M=205;
int m,n,f[M],w[N],c[N];
int main(){
	cin>>m>>n;
	for(int i=1;i<=n;i++) cin>>w[i]>>c[i];
	for(int i=1;i<=n;i++)
		for(int j=m;j>=1;j--)
			if(j>=w[i])
				f[j]=max(f[j],f[j-w[i]]+c[i]);
	cout<<f[m];
	return 0;
}

蒟蒻的第一篇讲解,如果有错,大佬麻烦私聊通知,Thanks♪(・ω・)ノ

十分感谢你有耐心读完我的题解 点个赞支持一下吧(〃'▽'〃)

ヾ( ̄▽ ̄)Bye~Bye~

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值