动态规划-背包问题

  • 1.P1060 开心的金明

https://www.luogu.org/problemnew/solution/P1164

#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>

#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 100
#define MAX 1<<30
#define V vector<int>

using namespace std;

int v[LEN],p[LEN];//价钱,重要度
int dp[LEN][30001];
int n,m;

int main(){
//    freopen("D:/CbWorkspace/动态规划/开心的王明.txt","r",stdin);
    int i,j;
    scanf("%d %d",&n,&m);
    F(i,1,m+1){
        scanf("%d",&v[i]);
        scanf("%d",&p[i]);
    }
    F(i,1,m+1){
        F(j,1,n+1){
            if(v[i]>j)
                dp[i][j]=dp[i-1][j];
            else{
                dp[i][j]=max(dp[i-1][j],
                            dp[i-1][j-v[i]]  +  p[i] * v[i]);
            }
        }
    }
    printf("%d",dp[m][n]);
    return 0;
}


  • 2.P1164 小A点菜

https://www.luogu.org/problemnew/show/P1164

#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>

#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 100
#define MAX 1<<30
#define V vector<int>

using namespace std;

int v[LEN];//价钱
int dp[101][1001];
int n,m;

int main(){
    freopen("小A点菜.txt","r",stdin);
    int i,j;
    scanf("%d %d",&n,&m);//n种,m元
    F(i,1,n+1) scanf("%d",&v[i]);
    F(i,1,n+1){
        bool isSet=false;
        F(j,1,m+1){
            if(isSet){ dp[i][j]=dp[i][j-1];continue;}
            if(v[i]>j)
                dp[i][j]=dp[i-1][j];
            else{
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+1);
            }
        }
    }
    printf("%d",dp[n][m]);
    return 0;
}

定义f[i][j]为用前i道菜用光j元钱的办法总数,其状态转移方程如下:

(1)if(j==第i道菜的价格)f[i][j]=f[i-1][j]+1;

(2)if(j>第i道菜的价格) f[i][j]=f[i-1][j]+f[i-1][j-第i道菜的价格];

(3)if(j<第i道菜的价格) f[i][j]=f[i-1][j];

说的简单一些,这三个方程,每一个都是在吃与不吃之间抉择。若钱充足,办法总数就等于吃这道菜的办法数与不吃这道菜的办法数之和;若不充足,办法总数就只能承袭吃前i-1道菜的办法总数。依次递推,在最后,我们只要输出f[n][m]的值即可。

原文地址:https://www.cnblogs.com/TQCAI/p/8419468.html

时间: 2024-11-08 10:47:24

动态规划-背包问题的相关文章

nyist oj 289 苹果 (动态规划——背包问题)

苹果 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. 输入 有多组测试数据,每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v,n.v同时为0时结束测试,此时不输出.接下来的n行,每行2个正整数,用空格隔开,分别代表苹果的大小c和价钱w.所有输入数字的范围大于等于0,小于等于1000. 输出 对每组测试数据输出一个整数,代表能放入背包的苹

动态规划——背包问题入门

动态规划--背包问题入门 1. 01背包 概述 给出N个物品,每个物体都具有一定的体积和价值,而每个物体都只有一个. 拥有一个V体积的背包,问应如何装包才能使背包中物体的总价值最大? 解题思路 背包问题是典型的动态规划类题目,而动态规划是典型的通过规律找出正解的方法.所以解题思路的关键在于如何寻找不同数据之间的关系(状态转移). 直接描述不方便解释,我们以例题为例: (注:01背包问题不涉及因为物体的形状.大小等而如何放入背包的问题,只是单纯考虑体积和价值.我们可以理解成每个物体都是液体,而这个

oj算法----动态规划----背包问题

oj算法----动态规划----背包问题 1.动态规划 1.1概念 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法 1.2性质 动态规划一般用来处理最优解的问题.使用动态规划算法思想解决的问题一般具有最优子结构性质和重叠子问题这两个因素. <1> 最优子结构 一个问题的最优解包含其子问题的最优解,这个性质被称为最优子结构性质 <2> 重叠子问题 递归算法求解问题时,每次产生的子问题并不总是新问

动态规划——背包问题

背包问题是一类非常典型的动态规划问题,包括多种类型(01背包.完全背包.多重背包.混合背包.二维费用背包等)其基本类型为01背包问题. 一.01背包问题 N件物品,每件物品的重量和价值分别为 w[i], v[i], 把这些物品放到一个容量为W的背包中,求背包中物品的价值的最大值. 形式化定义:  分析     最直观的思路是枚举背包中出现的所有可能的物品组合,然后计算它们的价值和,求最大值.如果直接采用递归搜索,则会有大量的冗余,通过记忆化搜索的方式可以进行改进(记忆 max[i][w], 前i

动态规划-背包问题 Knapsack

2018-03-15 13:11:12 背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高.问题的名称来源于如何选择最合适的物品放置于给定背包中. 相似问题经常出现在商业.组合数学,计算复杂性理论.密码学和应用数学等领域中. 一.0/1背包问题 背包问题是个NPC问题,01背包可以通过动态规划算法在伪多项式时间内给出解. 0/1背包问题的特点是,每种物品仅仅

动态规划——背包问题python实现(01背包、完全背包、多重背包)

目录 01背包问题 完全背包问题 多重背包问题 参考: 背包九讲--哔哩哔哩 背包九讲 01背包问题 01背包问题 描述: 有N件物品和一个容量为V的背包. 第i件物品的体积是vi,价值是wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包流量,且总价值最大. 二维动态规划 f[i][j] 表示只看前i个物品,总体积是j的情况下,总价值最大是多少. result = max(f[n][0~V]) f[i][j]: 不选第i个物品:f[i][j] = f[i-1][j]; 选第i个物品:

动态规划背包问题 洛谷P1064 金明的预算方案

P1064 金明的预算方案 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行".今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子: 主件 附件 电脑 打印机,扫描仪 书柜 图书 书桌 台灯,文具 工作椅 无 如果要买归类为附件的物品,必须先买该附件所属的主件.每个主件可以有

【动态规划】01背包问题_两种解法

问题描述 0-1背包问题:给定\(n\)种物品和一背包.物品i的重量是\(w_i\),其价值为\(v_i\),背包的容量为\(C\).问:应该如何选择装入背包的物品,使得装人背包中物品的总价值最大? 在选择装人背包的物品时,对每种物品\(i\)只有两种选择,即装人背包或不装入背包.不能将物品\(i\)装入背包多次,也不能只装入部分的物品\(i\).因此,该问题称为0-1背包问题. 此问题的形式化描述是,给定\(C>0\),\(w_i>0\),\(v_i>0\),\(1≤i≤n\),要求找

第十六章 贪心算法——0/1背包问题

1.问题描述: 给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 形式化描述:给定c >0, wi >0, vi >0 , 1≤i≤n.要求找一n元向量(x1,x2,…,xn,), xi∈{0,1}, ∋ ∑ wi xi≤c,且∑ vi xi达最大.即一个特殊的整数规划问题. 2.最优性原理: 设(y1,y2,…,yn)是 (3.4.1)的一个最优解.则(y2,…,yn)是下面相应子问题的一个最优解: