我是靠谱客的博主 甜美雪碧,最近开发中收集的这篇文章主要介绍基础DP(硬币问题),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

n个硬币,面值v1 v2 v3...输入金额求最少组合数

import java.util.Scanner;
public class Coin1 {
//最少硬币组合
public static int Money=251;
public static int [] type= {1,5,10,25,50};
public static int[] Min=new int[Money];
public static int[] Min_path=new int[Money];
public static void solve()
{
for(int k=0;k<Money;k++)
{
Min[k]=65535;
}
Min[0]=0;
for(int j=0;j<5;j++)
{
for(int i=type[j];i<Money;i++)
{
if(Min[i]>Min[i-type[j]]+1)
{
Min_path[i]=type[j];
Min[i]=Min[i-type[j]]+1;
}
}
}
}
public static void print_ans(int s)//打印硬币组合
{
while(s!=0) {
System.out.print(Min_path[s]+" ");
s=s-Min_path[s];
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int s;
solve();
Scanner sc=new Scanner(System.in);
while((s=sc.nextInt())!=0) {
System.out.println("最少"+Min[s]+"个");//输出最少硬币个数
print_ans(s);//打印硬币组合
}
}
}

求每种金额对应的组合数

dp[i][j]:金额为i,j个硬币

dp[i][j]=dp[i][j]+dp[i-type[k]][j-1];

import java.util.Scanner;
//最多100个硬币
//相比Coin1有限制多了一个硬币数维度
public class Coin0 {
public static int Money=251;//最多不超过250块
public static int COIN=101;//最多不超过100
public static int [] type= {1,5,10,25,50};
public static int[][] dp=new int[Money][COIN];
public static void solve() {
dp[0][0]=1;
for(int i=0;i<5;i++)
{
for(int j=1;j<COIN;j++)
{
for(int k=type[i];k<Money;k++)
{
dp[k][j]+=dp[k-type[i]][j-1];//面额k 硬币数j
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int s;
int[] ans=new int[Money];//记录每种面额对应的组合数
solve();
for(int i=0;i<Money;i++)
{
for(int j=0;j<COIN;j++)
{
ans[i]+=dp[i][j];
}
}
Scanner sc=new Scanner(System.in);
while((s=sc.nextInt())>0)
{
System.out.println(ans[s]);
}
}
}

最后

以上就是甜美雪碧为你收集整理的基础DP(硬币问题)的全部内容,希望文章能够帮你解决基础DP(硬币问题)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部