算法考题-货币
来源:互联网 发布:android 防止sql注入 编辑:程序博客网 时间:2024/05/29 07:13
- 题目
给定n张面值的货币,求这些货币进行组合时,不能表示的最小数目。 - 输入格式
第一行一个整数n(0 < n <= 100),表示有多少张货币。第二行n个整数,表示n张货币的具体面值,取值[1,100]。面值可重复。 - 输出格式
输出n张货币不可以组合成的最小面值。 - 输入样例
5
1 2 3 9 100 - 输出样例
7 - 思路
典型的0-1背包问题,采用动态规划办法。设置一个二维数组,横坐标j代表组合的面值,纵坐i标代表第i张货币,如果前i张能够表示j,则map[i][j] = 1,否则为 0。对于第i张货币,有参与组合和不参与组合两种结果。对于每一个j,若j >= i的面值,则如果map[i-1][j-i的面值] = 1,或者map[i-1][j] = 1,则map[i][j] = 1;若j < i, 则map[i][j] = map[i-1][j]。
#include<iostream>using namespace std;short map[105][10005];short value[105];//记录第i张面值大小 int main(){ int n; cin >> n; for(int i = 1; i <= n; i++) { cin >> value[i]; } for(int i = 0; i <= n; i++) { map[i][0] = 1; } //dp for(int i = 1; i <= n; i++) { for(int j = 1; j <= 10000; j++) { if(j >= value[i]) if(map[i-1][j-value[i]] == 1 || map[i-1][j] == 1) map[i][j] = 1; else map[i][j] = 0; else map[i][j] = map[i-1][j]; } } int min; //寻找结果,输出 for(int j = 1; j <= 10000; j++) { int flag = 0; for(int i = 1; i <= n; i++) { if(map[i][j] == 1) flag = 1; } if(flag == 0) { min = j; break; } } cout << min << endl; return 0;}
0 0
- 算法考题-货币
- 再拾算法考题
- js货币格式化算法
- 虚拟货币算法
- 数字货币算法
- 考题
- 考题
- 考题
- 考题
- 考题
- 【C++面试】常考题复习:排序算法
- SLAM:SLAM算法的考题总结
- 算法考题---最小的k个数
- 货币
- 算法_动态规划_货币兑换
- 数字货币开发专题(安全散列算法SHA256)
- 数字货币开发专题(X11算法矿池挖矿教程)
- 数字货币开发共识机制与分布式一致性算法
- 小白报道
- 项目:文件的压缩与解压
- 建议118:使用SecureString保存密钥等机密字符串
- WebService学习总结(四)——调用第三方提供的webService服务(.net问题)
- Python获取网页源码并保存为文件Demo
- 算法考题-货币
- 51nod 1135 原根 (数论)
- 图解understand分析一个asp.net办公系统源码
- mysql 锁分类概述
- C++ websocket库 websocketpp/websocket++例子编译试用
- js找出页面宽度和高度大于某个值的所有节点
- js常用事件
- Ubuntu 安装Chromium浏览器并添加Flash插件Pepper Flash Player
- 关于部分手机的Edtitext光标样式问题