IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 货币组合成aim的种类数 -> 正文阅读

[数据结构与算法]货币组合成aim的种类数

给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数,求组成aim的种类数。

输入描述:

输入包括两行,第一行两个整数n(0<=n<=1000)代表数组长度和aim(0<=aim<=5000),第二行n个不重复的正整数,代表arr。

输出描述:

输出一个整数

示例1

输入

3 10
5 2 3

输出

4

示例2

输入

4 350
5 2 3 1

输出

249582

暴力递归:

import java.util.Scanner;

public class Coins {
	public static int coinWays(int[] arr,int aim) {
		if(arr==null||aim<0)return 0;
		return process(arr,0,aim);
	}
	public static int process(int[] arr,int index,int left) {//index:只能从index及其往后的钱币里面选择, left:剩下的钱
		int N=arr.length;
		if(index>=N) {
			return left==0?1:0;
		}
		int ans=0;
		for(int num=0;num*arr[index]<=left;++num) {
			ans+=process(arr,index+1,left-num*arr[index]);
		}
		return ans;
	}
	 
	public static void main(String[] args) {
		int n,aim;
		Scanner scan=new Scanner(System.in);
		n=scan.nextInt();
		aim=scan.nextInt();
		int[] arr=new int[n];
		for(int i=0;i<n;++i) {
			arr[i]=scan.nextInt();
		}
		int ans1,ans2;
		ans1=coinWays(arr,aim);
		System.out.println(ans1);
	}
}


动态规划:

共有index,left两个可变参数,建立一张二维表。 index : 0 ~ N ; left : 0 ~ aim 。

初始化:

if(index>=N) {
			return left==0?1:0;
		}

很明显,第N行中, dp [N] [0] 位置填1,其余都填0。

状态转移方程:

下面的二维表中:
红色格子dp[0][aim]为所求,由暴力递归可知,绿色格子的值关联其下面一行的蓝色位置的格子,而这些蓝色格子又被橙色格子所关联,所以最后,绿色格子与橙色格子及绿色格子正下方的蓝色格子相关联。(其中蓝色格子之间的间距是arr[i],i为绿色格子所在行号)。

在这里插入图片描述

import java.util.Scanner;

public class Coins {
	
	public static int DP(int[] arr,int aim) {
		int N=arr.length;
		int[][] dp=new int[N+1][aim+1];
		dp[N][0]=1;
		for(int i=N-1;i>=0;--i) {
			for(int j=0;j<=aim;++j) {
//				dp[i][j]=dp[i+1][j]+
//						dp[i][j-arr[i]];
				dp[i][j]=getValue(arr,dp,aim,i+1,j)+getValue(arr,dp,aim,i,j-arr[i]);
			}
		}
		return dp[0][aim];
	}
	public static int getValue(int[] arr,int[][]dp, int aim,int i,int j) {
		if(i<0||i>arr.length||j<0||j>aim)return 0;
		return dp[i][j];
	}
	public static void main(String[] args) {
		int n,aim;
		Scanner scan=new Scanner(System.in);
		n=scan.nextInt();
		aim=scan.nextInt();
		int[] arr=new int[n];
		for(int i=0;i<n;++i) {
			arr[i]=scan.nextInt();
		}
		int ans1,ans2;
		ans2=DP(arr,aim);
		System.out.println(ans2);
	}
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-09 16:31:37  更:2021-10-09 16:32:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 12:12:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码