当前位置: 首页 > news >正文

AcWing 11:背包问题求方案数 ← 0-1背包

【题目来源】
https://www.acwing.com/problem/content/11/

【题目描述】
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出
最优选法的方案数。注意答案可能很大,请输出答案模 10^9+7 的结果。

【输入格式】
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。

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

【数据范围】
0<N,V≤1000 
0<vi,wi≤1000

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

【输出样例】
2

【算法分析】
设 f[i] 为背包容积为 i 时的最佳方案的总价值,cnt[i] 为背包容积为 i 时总价值为最佳的方案数。
由于背包里什么也不装也是一种方案,故初始化所有的 cnt{i] 为 1。
如果装新物品的方案总价值更大,那么用 f[j-vol]+val 来更新 f[j],用 cnt[j-vol] 更新 cnt[j]。
如果总价值相等,那么最大价值的方案数就多了 cnt[j-vol] 种。

【算法代码】

#include <bits/stdc++.h>
using namespace std;const int MOD=1e9+7;
const int N=1e3+5;
int f[N],cnt[N];int main() {int n,v;cin>>n>>v;for(int i=0; i<=v; i++) cnt[i]=1;for(int i=1; i<=n; i++) {int vol,val;cin>>vol>>val;for(int j=v; j>=vol; j--) {int t=f[j-vol]+val;if(t>f[j]) {f[j]=t;cnt[j]=cnt[j-vol];} else if(t==f[j]) {cnt[j]=(cnt[j]+cnt[j-vol])%MOD;}}}cout<<cnt[v]<<endl;return 0;
}/*
in:
4 5
1 2
2 4
3 4
4 6out:
2
*/




【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/147326357
https://blog.csdn.net/hnjzsyjyj/article/details/147333181
https://www.acwing.com/solution/content/3999/



 

相关文章:

  • 科学研究:怎么做
  • [密码学基础]国密算法深度解析:中国密码标准的自主化之路
  • 计算机软考中级 知识点记忆——排序算法 冒泡排序-插入排序- 归并排序等 各种排序算法知识点整理
  • 腾讯云对象存储m3u8文件使用腾讯播放器播放
  • React 文章列表
  • 2024-04-19| Java: Documented注解学习 JavaDoc
  • 高可靠 ZIP 压缩方案兼容 Office、PDF、TXT 和图片的二阶段回退机制
  • 2025.04.19【Chord diagram】| 弦图绘制技巧大全
  • JavaScript 变量语法扩展
  • Ubuntu 25.04 “Plucky Puffin” 正式发布
  • tensor.repeat和tensor.repeat_interleave
  • Invicti-Professional-V25.4
  • 【Python标准库】数学相关的9个标准库
  • 八大排序之直接插入排序
  • ELK日志系统
  • Kubernetes控制平面组件:高可用 APIServer
  • 详解反射型 XSS 的后续利用方式:从基础窃取到高级组合拳攻击链
  • 定制一款国密浏览器(10):移植SM2算法前,解决错误码的定义问题
  • 【Linux】软件管理机制和软件安装
  • 软件测试--自动化测试1
  • 两岸基层民生发展交流会在浙江开幕
  • 女子伸腿阻止高铁关门被拘,央媒:严格依规公开处理以儆效尤
  • 影子调查丨义门陈遗址建筑被“没收”风波
  • 跑马,一场对机器人的长测试
  • 谷雨播种正当时,上海黄道婆纪念公园种下“都市棉田”
  • 林间徐行寻风眠——关于浙美“徐宗帅捐赠纪念展”