DAG上的动态规划--硬币问题
来源:互联网 发布:mac qq同时登陆 编辑:程序博客网 时间:2024/06/09 13:58
题意:有n种硬币,面值分别为V1,V2,...Vn,每种都有无限多。给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的最小值和最大值。
分析:我们把每种面值看作一个点!表示“还需要凑足的面值”,初始状态为S,目标状态为0。那么若当前状态在i,每使用一个硬币j,状态便转移到i-Vj。
代码:
#include<bits/stdc++.h>using namespace std;const int MAXN = 10000;const int INF = 0x3f3f3f3f;int n, S, V[MAXN], d[MAXN], vis[MAXN];int dpmax(int S){ if(vis[S]) return d[S]; vis[S] = 1; int &ans = d[S]; ans = -INF; for(int i = 1; i <= n; ++i) { if(S >= V[i]) ans = max(ans, dpmax(S - V[i]) + 1); } return ans;}int dpmin(int S){ if(vis[S]) return d[S]; vis[S] = 1; int &ans = d[S]; ans = INF; for(int i = 1; i <= n; ++i) { if(S >= V[i]) ans = min(ans, dpmin(S - V[i]) + 1); } return ans;}void print_ans(int s){ for(int i = 1; i <= n; i++) { if(s >= V[i] && d[s] == d[s - V[i]] + 1) { printf("%d ",V[i]); print_ans(s-V[i]); break; } }}int main(){ memset(vis, 0, sizeof(vis)); cin >> n >> S; for(int i = 1; i <= n; ++i) cin >> V[i]; vis[0] = 1; d[0] = 0; cout << dpmax(S) << endl; print_ans(S); printf("\n"); memset(vis, 0, sizeof(vis)); vis[0] = 1; d[0] = 0; cout << dpmin(S)<< endl; print_ans(S); printf("\n"); return 0;}
阅读全文
0 0
- DAG上的动态规划------硬币问题
- DAG上的动态规划------硬币问题
- DAG上的动态规划硬币问题
- DAG上的动态规划--硬币问题
- 硬币问题(DAG上的动态规划)
- ACM:DAG上的动态规划------硬币问题
- 动态规划-DAG-硬币问题
- DAG 动态规划 -- 硬币问题
- 动态规划 DAG模型 硬币问题
- DAG上的动态规划问题
- DAG上的动态规划
- DAG上的动态规划
- DAG上的动态规划
- DAG上的动态规划
- DAG上的动态规划
- 硬币问题(字典最小序)-DAG动态规划问题
- Monkey and Banana(DAG上的动态规划问题)
- 矩阵嵌套问题(DAG上的动态规划)
- [cnblogs镜像] Python2以及Python3中的除法
- eclipse validation功能
- 快速排序算法及实现
- 京东爬取评论简单分析
- 如何安装Composer和使用Packagist 镜像
- DAG上的动态规划--硬币问题
- UVa 102|Ecological Bin Packing|暴力
- mvc +ef 框架实现上传excel表格并实现批量增加
- 【C++】第5章 循环和关系表达式 知识总结
- 数据处理过程——Data Processing
- 高级加密标准
- 1712: 数交点 正n边形内交点的个数
- HNU OJ题库 1001A数塔
- JS(7)