7.背包问题求方案数

问题:
有N件物品和一个容量是V的背包。

每件物品只能用一次,第i件物品的体积是vi,价值是wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包的容量,且价值总和最大。

输出最优选法方案数。注意答案可能很大,请输出答案模10^9+7的结果

输入格式
第一行有两个整数,N,V用空格隔开,分别表示物品数量、背包容积。

接下来有N行,每行两个个整数vi,wi,用空格隔开,分别表示第i件物品的体积、价值。

输出格式
输出一个整数,表示方案数模10^9的结果。

数据范围
0<N,V<=1000
0<V,M<=1000

输入样例
4 5
1 2
2 4
3 4
4 6

输出样例
2

分析思路:

f[i]:体积是恰好j的情况下,最大价值是多少
g[i]:体积是j的情况下, 方案数是多少

第一种决策,最大值和最优解一样
先算选和不选两种方案最大价值是多少,看到底从哪个决策转移过来
假设其中一个比另外一个大 ,只能从其中一种决策转移过来 (选择决策的方案数)
若两种决策答案一样 ,把两种决策方案数都要选择
更新的时候同时需要更新g数组

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;const int N=1010,mod=1000000009,INF=1000000;
int n,m;
int f[N],g[N]; //g[i]体积是j的情况下 方案数是多少
int main(){  //f[j]体积恰好是j的情况下 cin>>n>>m;g[0]=1; //体积是0的方案数只有1种 for(int i=1;i<=m;i++) f[i]=-INF;  //f[0]=0,除此之外初始状态记为负无穷,所有状态从0开始更新 for(int i=0;i<n;i++)  //枚举物品 {int v,w;cin>>v>>w;for(int j=m;j>=v;j--) //从大到小枚举体积 {int t=max(f[j],f[j-v]+w); //第一种决策,最大值和最优解一样 int s=0;if(t==f[j]) s+=g[j]; //两种都选择if(t==f[j-v]+w) s+=g[j-v]; //第二种决策,最大值和最优解一样,两种都选择if(s>=mod) s-=mod;  //答案和大于10^9,减去这个数 f[j]=t;  //记录最优解 g[j]=s; //记录方案数 }}//统计最优解方案数,遍历整个数组,最优解不一定是f,不一定要用满f的体积才能得到 int maxw=0;for(int i=0;i<=m;i++) maxw=max(maxw,f[i]);int res=0;for(int i=0;i<=m;i++) //所有等于最优解的方案 if(maxw==f[i]){res+=g[i];  //加上体积是i的方案数 if(res>=mod)res-=mod;}cout<<res<<endl;return 0;
}

九大背包问题专题--背包问题求方案数相关推荐

  1. 九大背包问题专题--背包问题求具体方案数

    8.背包问题求具体方案数 问题: 有N件物品和一个容量是V的背包. 每件物品只能用一次,第i件物品的体积是vi,价值是wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包的容量,且价值总和最 ...

  2. 01背包,完全背包,多重背包,混合背包,二维费用背包,分组背包,背包问题求方案数

    1 01背包问题 有 NNN 件物品和一个容量是 VVV 的背包.每件物品只能使用 一次. 第 iii 件物品的体积是 viv_ivi​,价值是 wiw_iwi​.求解将哪些物品装入背包,可使这些物品 ...

  3. 经典背包问题3——背包问题求方案数 、背包问题求具体方案

    经典背包问题3--背包问题求方案数 .背包问题求具体方案 1. 背包问题求方案数 2. 背包问题求具体方案 1. 背包问题求方案数 有 N 件物品和一个容量是 V的背包.每件物品只能使用一次. 第 i ...

  4. 自然数拆分(完全背包问题求方案数)

    给定一个自然数N,要求把N拆分成若干个正整数相加的形式,参与加法运算的数可以重复. 注意: 拆分方案不考虑顺序: 至少拆分成2个数的和. 求拆分的方案数 mod 2147483648的结果. 输入格式 ...

  5. [01背包] 背包问题求具体方案(01背包+求方案数+思维)

    文章目录 0. 前言 1. 01背包+求方案数+思维 0. 前言 相关: [背包] 背包问题算法模板(模板) 1. 01背包+求方案数+思维 12. 背包问题求具体方案 求方案数也是背包问题.dp 的 ...

  6. 动态规划之如何将问题抽象转化为0-1背包问题(详解利用动态规划求方案数)

    ⭐️前面的话⭐️ 本篇文章介绍如何对问题抽象转化成0-1背包问题求解和运用0-1背包求方案数.

  7. [完全背包] 货币系统(完全背包+求方案数)

    文章目录 0. 前言 1. 完全背包+求方案数+思维 0. 前言 相关: [背包] 背包问题算法模板(模板) 强相关: [完全背包] 买书(完全背包+裸题) [完全背包] 货币系统(完全背包+求方案数 ...

  8. 7-30 找单词——多重背包求方案数

    假设有x1个字母A, x2个字母B,- x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,- 字母Z的价值为26.那么,对于给定的字母,可以找到多少价值<=50的单词呢?单词的价值就是 ...

  9. [01背包] 数字组合(01背包+求方案数)

    文章目录 0. 前言 1. 01背包求方案数 0. 前言 相关: [背包] 背包问题算法模板(模板) 1. 01背包求方案数 278. 数字组合 将 M 看作背包容量,每个数看成一个物品,Ai 看成是 ...

  10. 观光(最短路求方案数2)

    题目描述 "您的个人假期"旅行社组织了一次比荷卢经济联盟的巴士之旅. 比荷卢经济联盟有很多公交线路. 每天公共汽车都会从一座城市开往另一座城市. 沿途汽车可能会在一些城市(零或更多 ...

最新文章

  1. VC++下命名管道编程的原理及实现
  2. 【计算机网络(微课版)】第5章 传输层 课后习题及答案
  3. 中商惠民李超:500,000+ 便利店背后的精细化管理
  4. c++ properties_Java怎么从这四个位置读取配置文件Properties(普通文件系统-classpath-jar-URL)
  5. 牛客 - Dance with a stick(大风车模型)
  6. Flink SQL Client注册Python UDF完整流程
  7. Git和GitHub快速入门
  8. 洛谷——P2820 局域网
  9. 一级计算机考试电子表格排序筛选,重新应用Excel排序和筛选或清除筛选
  10. 通过UA判断手机的类型
  11. 金融人都在选择的硕士项目---中国人民大学与加拿大女王大学金融硕士
  12. CSS第7章上机练习1(制作QQ会员页面导航)
  13. 摄影测量中的什么是光流场_摄影中的“停止”是什么?
  14. 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置
  15. 限期4个月:苹果严控版号,开发者将如何自救?
  16. 给软件添加鼠标右键快捷方式
  17. c++ 因数分解(递归)
  18. (2020)使用Airtest来爬取某宝评论数据
  19. [JIRA] 从3.6.2旧版升级到新版6.0.8的详细过程
  20. 工作流模式每个工作流引擎都会支持多种方式的表单。目前大家讨论到的大概有三种。 动态表单 外置表单 普通表单

热门文章

  1. 基于安卓的高清语音技术亮相中国国际通信展览会
  2. C语言圆角矩形画法,GDI+ 如何绘制圆角矩形(vc++)
  3. 浅谈OSPF的DRBDR
  4. 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明
  5. POJ1417 True Liars —— 并查集 + DP
  6. 【PPT技巧】让PPT背景音乐仅在播放视频时暂停
  7. 图片转公式再转到word或者wps里面
  8. Overture五线谱乐理小课堂——音程 (上)
  9. 【学习笔记】组合恒等式
  10. 035 导数 微分对应表