题解-01背包

01背包

描述
一个旅行者有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是W1,W2,…,Wn,它们的价值分别为C1,C2,…,Cn,求旅行者能获得最大总价值。

输入
第一行:两个整数,M(背包容量,M≤200)和N(物品数量,N≤30);

第2…N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。

输出
仅一行,一个数,表示最大总价值。

输入样例 1
10 4
2 1
3 3
4 5
7 9
输出样例 1
12
来源
一本通

题解-01背包_第1张图片

1.简单01背包:

https://blog.csdn.net/nvliba/article/details/49406379

2.01背包+思维。POJ 3628 Bookshelf 2(DP:01背包)

要考虑到一共价值是s,那么选择的s-h的背包中价值最大maxx,然后用s-h-maxx就是多出h的那一小部分最小,因为总和是一定的所以一定可以装满h+多出的一小部分。

https://blog.csdn.net/u013480600/article/details/22763769

3.HDU 2546饭卡(DP:01背包)

思路就是让总容量-5(因为余额大于5才能买一个最大的)求个背包,再减掉最大的物品。

https://blog.csdn.net/u013480600/article/details/22793801

4.Robberies(01背包+概率)

把银行的钱当做背包,把概率当做价值,总容量为所有银行的总钱数,求不超过被抓

概率的情况下,最大的背包容量是多少

dp[j] = max(dp[j],dp[j-Bag[i].v]*(1-Bag[i].p))(dp[j]表示在被抢概率j之下能抢的钱);

https://blog.csdn.net/lianai911/article/details/40183907

5.https://blog.csdn.net/u013480600/article/details/22793943

没看懂。。。贪心+背包。

***6.   01背包+按照背包的顺序输出路径。

UVA 624 CD(DP:01背包)

可以这么想,每一个背包都跟能容纳他的容量有联系,用vis进行标记。

然后每一个东西都判断一下跟当前选的东西有无影响。

https://blog.csdn.net/xianpingping/article/details/81914776

https://blog.csdn.net/u013480600/article/details/22819213

7.背包+思维

UVA 562  Dividing coins(DP:01背包)

就是怎么分两堆硬币,使得两堆差值最小。以sum/2为背包容量得解。

https://blog.csdn.net/u013480600/article/details/22822593

8.思维poj3211(Washing Clothes + 0/1背包)

sum/2的思想:https://blog.csdn.net/wy_kath/article/details/7856414

9.hdu 1203- I NEED A OFFER!(概率)(反着想)

这道题让求得到至少得到一份offer的最大概率,直接对这个问题进行处理有些麻烦,那么我们可以通过算出一份offer也拿不到的最小概率,通过概率和是1我们就可以得到要求的答案了,跟抢劫那一题比较像,概率是相乘而不是相加

https://blog.csdn.net/qq_35323001/article/details/52242393

***10.POJ 1837 Balance(感觉这道题跟背包没关系。。。)(好题!)

https://blog.csdn.net/lyhvoyage/article/details/45064083

11.好题!二维背包

HDU 3496 Watch The Movie
https://blog.csdn.net/madaidao/article/details/35991521

题意:有商品个数限制的背包问题。

在普通的背包问题上再开一维表示已经买了的商品的个数。dp[i][j][k]表示前i个物品,花费为j,已经买了K个商品的最大价值。

转移方程为:

dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-v][k-1]+w)

作者:sdau_blue
来源:CSDN
原文:https://blog.csdn.net/xianpingping/article/details/81909025
版权声明:本文为博主原创文章,转载请附上博文链接!
代码:

#include
using namespace std;
int w[1000],v[1000],dp[100000];
int main(){
	int m,n;
	cin>>m>>n;
	for(int i=1;i<=n;i++){
		cin>>w[i]>>v[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=m;j>=0;j--){
			if(j>=w[i])dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
		}
	}
	cout<

你可能感兴趣的:(题解)