【动态规划】经典例题

一.动态规划三要素

1.最优子结构

2.状态转移方程 (核心)(一般用打表找出规律)

3.边界值

二.背包问题

(一.题目)

1.1题目描述

现在有一个背包但容量有限,最多只能装m千克宝石!有n个宝石,每个宝石都有自己的重量m和价值c。求可以装的宝石的最大价值。

1.2输入输出描述

        输入:两个整数m和n,表示背包最大容量和宝石数量

                   接下来的n行分别表示每个宝石的重量和价值

        输出:可以装的宝石的最大价值

1.3样例

输入:

8 3
2 3
5 4
5 5

输出:

8

(二.思路)

【动态规划】经典例题_第1张图片

 打表找规律

【动态规划】经典例题_第2张图片

 (三.核心代码)

//外遍历宝石数量 
	for(int i=1;i<=n;i++){
		//内遍历背包容量 
		for(int j=1;j<=m;j++){
			//装不下 
			if(j

(四.【AC代码】)

#include
using namespace std;
int w[1001],c[1001];  //分别表示物体重量和价值
int f[1001][1001];  //表示物体编号为i,背包容量为j时,最大价值 
int main(){
	int m,n;
	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=1;j<=m;j++){
			//装不下 
			if(j

三.买宝石

(一.题目)

1.1题目描述

假设我们有v(1

1.2输入输出描述

输入:

一个整数v表示有v种宝石,一个整数n表示有n元

v个整数分别表示每种宝石的价格

输出:

有多少种购买方案

1.3样例

输入:

3 8
1 2 5

输出:
7

(二.思路)

根据打表,可以找到边界和状态转移方程

说明:i为多少种宝石,j表示价值

【动态规划】经典例题_第3张图片

1.我们可以得到边界为:(1)f[0][j]=0,f[i][0]=1;

                                        (2)if(i>1) for(j=0;j

2. 我们得到状态转移方程为:f[i][j]=f[i-1][j]+f[i][j-p]   //i为当前宝石的价格

(三.核心代码) 

(四.【AC】代码)

#include
using namespace std;
int v,n,p,i,j;
int f[1001][1001]; 
int main(){
	cin>>v>>n;
	for(i=1;i<=v;i++){
		cin>>p;
		//边界 
		f[i][0]=1;
		if(i>1){
			for(j=0;j

你可能感兴趣的:(动态规划,动态规划,算法)