紫书dp 硬币问题
来源:互联网 发布:淘宝匡威正品店 编辑:程序博客网 时间:2024/05/17 10:39
问题:有n种硬币,面值分别为V1,V2……Vn,每种都有无限多。给定非负整数s,可以选用多少个硬币,使得面值之和恰好为s?输出硬币数目最小值和最大值。
但本题的本质也是DAG上的路径问题。将每种面值看作一个点,表示“还需要凑足的面值”,则初始状态为S,目标状态为0.若当前在状态i,每使用一个硬币j,状态则转移到i-Vj。
记忆化搜索
int dp(int s){ if(vis[s] return d[s]; vis[s]=1; int& ans=d[s]; ans = -(1<<30); for(int i=1;i<=n;i++) if(s>=v[i]) ans = max(ans,dp(s-v[i])+1); return ans;}
递推
#include <bits/stdc++.h>using namespace std;#define INF 1<<30const int maxn = 1e5+100;int minv[maxn],maxv[maxn];int v[101];int main(){ int n,s,i; while(scanf("%d%d",&n,&s)!=EOF) { for(int i=1;i<=n;i++) cin>>v[i]; minv[0]=0,maxv[0]=0; for(int i=1;i<=s;i++) { minv[i] = INF; maxv[i] = -INF; } for(int i=1;i<=s;i++) for(int j=1;j<=n;j++) if(i>=v[j]) { minv[i]=min(minv[i],minv[i-v[j]]+1); maxv[i]=max(maxv[i],maxv[i-v[j]]+1); } printf("%d %d\n",minv[s],maxv[s]); } return 0;}
阅读全文
0 0
- 紫书dp 硬币问题
- 【dp】最少硬币问题
- DP 换硬币问题
- 硬币问题(DP)
- dp 硬币找零问题
- 硬币问题 经典dp
- dp 之硬币问题
- 硬币问题(经典dp)
- BToj 1030 硬币问题 【DP-完全背包】
- 入门经典--硬币问题dp递归加递推
- DP-硬币问题(一维)
- DP经典应用(五)硬币问题
- 简单DP之最少硬币问题(多重背包问…
- UVA 11137 Ingenuous Cubrency 类似硬币问题的简单dp
- UVALive 6661 - Equal Sum Sets (类似硬币的DP问题)
- 关于硬币组合问题和DP的结合
- 算法——硬币选择问题(dp、贪心)
- 硬币问题
- 基础数论算法(⑨) 高斯消元与LU分解
- 通过数组方式向Oracle大批量插入数据(10万条11秒)
- bzoj2038: [2009国家集训队]小Z的袜子(hose)(莫队+分块模板题)
- phpmyadmin
- Spring 定时任务scheduled详解
- 紫书dp 硬币问题
- Android自定义折线图,可设置基准线,不同点颜色
- eclipse复制项目后原项目名依然伴随值所复制的项目名
- scala学习-DescriptionResourcePathLocationType value toDF is not a member of org.apache.spark.rdd.R
- MacPorts 初装后提示 command not found: port 解决方案
- 几个连接HiveServer的客户端界面工具
- Add Two Numbers
- 动态规划
- HDU 6130 Kolakoski数列