7-30 找单词——多重背包求方案数
假设有x1个字母A, x2个字母B,… x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,… 字母Z的价值为26。那么,对于给定的字母,可以找到多少价值<=50的单词呢?单词的价值就是组成一个单词的所有字母的价值之和,比如,单词ACM的价值是1+3+14=18,单词HDU的价值是8+4+21=33。(组成的单词与排列顺序无关,比如ACM与CMA认为是同一个单词)。
输入格式:
输入首先是一个整数N,代表测试实例的个数。
然后包括N行数据,每行包括26个<=20的整数x1,x2,…x26.
输出格式:
对于每个测试实例,请输出能找到的总价值<=50的单词数,每个实例的输出占一行。
输入样例:
2
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
9 2 6 2 10 2 2 5 6 1 0 2 7 0 2 2 7 5 10 6 10 2 10 6 1 9
输出样例:
在这里给出相应的输出。例如:
7
379297
分析
- 此题就是对于每个字母两种选择,选与不选,一开始直接搜索做了,但是运行不出来结果,思考下发现26!太大了,直接爆栈超时了,后听了浩哥的思路,就是多重背包问题,每件物品选与不选,一件物品有多件,然后背包容量为50之内;
- 之前学的是多重背包求解最大价值,这里是求方案数,所以这里就状态转移方程改变一下, dp[i][j] += dp[i - 1][j - k * i]; dp[i][j]就是前i件物品,容量为j的方案数;自然递推式就是加上 上一件物品在容量为j-k*i下的方案数(由于求方案数所以累加)
- 最后累加dp[26][i],把所有容量情况下的的方案数累加即可;
可以参考浩佬的:PTA 找单词
二维背包(AC)
#include<bits/stdc++.h>using namespace std;int n, ans;
int cnt[30];
int dp[30][55];//方案数int main() {cin >> n;while (n--) {ans = 0;memset(dp, 0, sizeof dp);for (int i = 1; i <= 26; ++i) {cin >> cnt[i];}dp[0][0] = 1;for (int i = 1; i <= 26; ++i) {//物品for (int j = 0; j <= 50; ++j) {//容量for (int k = 0; k <= cnt[i]; ++k) {//数量if (k * i <= j) {//可以装dp[i][j] += dp[i - 1][j - k * i];}}}}for (int i = 0; i <= 50; ++i) {ans += dp[26][i];}cout << ans - 1 << endl;//除去dp[0][0],单词是个空}return 0;
}
一维优化(WA)
用一维数组,思路同上,但是答案不对,不知道为啥不对,知道的大佬可以评论下;
#include<bits/stdc++.h>using namespace std;int n, ans;
int cnt[30];
int dp[55];//int main() {cin >> n;while (n--) {ans = 0;for (int i = 1; i <= 26; ++i) {cin >> cnt[i];}dp[0] = 1;for (int i = 1; i <= 26; ++i) {//物品for (int j = 50; j >= 0; --j) {//容量for (int k = 0; k <= cnt[i]; ++k) {//数量if (k * i <= j) {//可以装dp[j] += dp[j - k * i];}}}}for (int i = 0; i <= 50; ++i) {ans += dp[i];}cout << ans << endl;}return 0;
}
7-30 找单词——多重背包求方案数相关推荐
- [完全背包] 货币系统(完全背包+求方案数)
文章目录 0. 前言 1. 完全背包+求方案数+思维 0. 前言 相关: [背包] 背包问题算法模板(模板) 强相关: [完全背包] 买书(完全背包+裸题) [完全背包] 货币系统(完全背包+求方案数 ...
- [01背包] 背包问题求具体方案(01背包+求方案数+思维)
文章目录 0. 前言 1. 01背包+求方案数+思维 0. 前言 相关: [背包] 背包问题算法模板(模板) 1. 01背包+求方案数+思维 12. 背包问题求具体方案 求方案数也是背包问题.dp 的 ...
- [01背包] 数字组合(01背包+求方案数)
文章目录 0. 前言 1. 01背包求方案数 0. 前言 相关: [背包] 背包问题算法模板(模板) 1. 01背包求方案数 278. 数字组合 将 M 看作背包容量,每个数看成一个物品,Ai 看成是 ...
- 物资调度(01背包+求方案数)
物资调度 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷.衣物.食品和血浆等物资.可通往灾区的道路到处都是塌方,70 ...
- 【01背包求方案数模板】洛谷 P1164 小A点菜
洛谷 P1164 小A点菜 https://www.luogu.org/problemnew/show/P1164 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆, ...
- 牛客练习赛20 A-礼物(组合数学 or 完全背包求方案数)
题目链接:https://ac.nowcoder.com/acm/contest/128/A?&headNav=www 题目描述 如果不想读故事的話,可以直接跳到最后一段... 大一开 ...
- C. Feast Coins(背包求方案数)
ICPC Arab Collegiate Programming Contest 2014 C题 题解:转化为因子考虑,因为每一种选取相同的个数 #include <bits/stdc++.h& ...
- 动态规划之如何将问题抽象转化为0-1背包问题(详解利用动态规划求方案数)
⭐️前面的话⭐️ 本篇文章介绍如何对问题抽象转化成0-1背包问题求解和运用0-1背包求方案数.
- 01背包,完全背包,多重背包,混合背包,二维费用背包,分组背包,背包问题求方案数
1 01背包问题 有 NNN 件物品和一个容量是 VVV 的背包.每件物品只能使用 一次. 第 iii 件物品的体积是 viv_ivi,价值是 wiw_iwi.求解将哪些物品装入背包,可使这些物品 ...
最新文章
- 中国电子学会青少年编程能力等级测试图形化一级编程题:无奈的Jaime
- smarty2和smarty3
- android 数据存储路径
- 十六进制转double
- mysql数据结构优化,范式和反范式
- 前端学习(2782):获取轮播图的数据
- Ubuntu品牌机批量涌入世界市场,中国不会例外
- LeetCode 33. 搜索旋转排序数组(二分查找)
- eclipse linux远程调试工具,使用本地Eclipse IDE调试器与远程项目源(Linux)
- 巴黎圣母院大火之后,AI 技术如何在文物修复场景落地?
- vbs中使用select case条件语句,case中匹配项多于一个时,提示:type mismathc/ 800A000D...
- C语言入门1(devC的安装)
- 高校图书馆管理系统 php 漏洞,江苏汇文Libsys图书馆管理系统几处通用SQL注入漏洞...
- linux的桌面分辨率设置,linux xorg屏幕分辨率设置
- 使用源码编译的方式安装Tor
- Windows驱动的加载顺序
- WP-南邮CTF逆向第三题 Py交易
- paurse java_在eclipse中通过RSE插件运行远程java程序时遇到问题
- 工业机器人常用的六种坐标系
- 110配线架打法图解_110配线架打法图解 110配线架图片