假设有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

分析

  1. 此题就是对于每个字母两种选择,选与不选,一开始直接搜索做了,但是运行不出来结果,思考下发现26!太大了,直接爆栈超时了,后听了浩哥的思路,就是多重背包问题,每件物品选与不选,一件物品有多件,然后背包容量为50之内;
  2. 之前学的是多重背包求解最大价值,这里是求方案数,所以这里就状态转移方程改变一下, dp[i][j] += dp[i - 1][j - k * i]; dp[i][j]就是前i件物品,容量为j的方案数;自然递推式就是加上 上一件物品在容量为j-k*i下的方案数(由于求方案数所以累加)
  3. 最后累加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 找单词——多重背包求方案数相关推荐

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

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

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

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

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

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

  4. 物资调度(01背包+求方案数)

    物资调度 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷.衣物.食品和血浆等物资.可通往灾区的道路到处都是塌方,70 ...

  5. 【01背包求方案数模板】洛谷 P1164 小A点菜

    洛谷 P1164 小A点菜 https://www.luogu.org/problemnew/show/P1164 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆, ...

  6. 牛客练习赛20 A-礼物(组合数学 or 完全背包求方案数)

    题目链接:https://ac.nowcoder.com/acm/contest/128/A?&headNav=www 题目描述 如果不想读故事的話,可以直接跳到最后一段...     大一开 ...

  7. C. Feast Coins(背包求方案数)

    ICPC Arab Collegiate Programming Contest 2014 C题 题解:转化为因子考虑,因为每一种选取相同的个数 #include <bits/stdc++.h& ...

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

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

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

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

最新文章

  1. 中国电子学会青少年编程能力等级测试图形化一级编程题:无奈的Jaime
  2. smarty2和smarty3
  3. android 数据存储路径
  4. 十六进制转double
  5. mysql数据结构优化,范式和反范式
  6. 前端学习(2782):获取轮播图的数据
  7. Ubuntu品牌机批量涌入世界市场,中国不会例外
  8. LeetCode 33. 搜索旋转排序数组(二分查找)
  9. eclipse linux远程调试工具,使用本地Eclipse IDE调试器与远程项目源(Linux)
  10. 巴黎圣母院大火之后,AI 技术如何在文物修复场景落地?
  11. vbs中使用select case条件语句,case中匹配项多于一个时,提示:type mismathc/ 800A000D...
  12. C语言入门1(devC的安装)
  13. 高校图书馆管理系统 php 漏洞,江苏汇文Libsys图书馆管理系统几处通用SQL注入漏洞...
  14. linux的桌面分辨率设置,linux xorg屏幕分辨率设置
  15. 使用源码编译的方式安装Tor
  16. Windows驱动的加载顺序
  17. WP-南邮CTF逆向第三题 Py交易
  18. paurse java_在eclipse中通过RSE插件运行远程java程序时遇到问题
  19. 工业机器人常用的六种坐标系
  20. 110配线架打法图解_110配线架打法图解 110配线架图片

热门文章

  1. Bug[5] 多路连接客户服务器,发送一路数据时,其他几路自动断开,查询PDP显示未被激活
  2. MFC动态改变图形控件picture control位置
  3. 如何在网页中视频加速
  4. 智能网联汽车——网联化
  5. 我的程序员之路(15)——2019年前半年总结
  6. 河南工业大学计算机科学与技术全国排名,2019河南工业大学专业排名
  7. Windows Server 8.1RTM版本安装
  8. CentOS 7视频音频解码器问题
  9. C++ 11的移动语义 - 清晰的示例及浅显的说理
  10. JavaSE_day04【数组】