小A点菜(洛谷P1164题题解,Java语言描述)
生活随笔
收集整理的這篇文章主要介紹了
小A点菜(洛谷P1164题题解,Java语言描述)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目要求
題目鏈接
分析
用DPDPDP做是必然的,講講二維的吧:
f[i][j]f[i][j]f[i][j]:用前iii道菜用光jjj元錢的可能組合數
剩下的錢等于第iii道菜的價格時,f[i][j]=f[i?1][j]+1f[i][j]=f[i-1][j]+1f[i][j]=f[i?1][j]+1
剩下的錢大于第iii道菜的價格時,f[i][j]=f[i?1][j]+f[i?1][j?v[i]]f[i][j]=f[i-1][j]+f[i-1][j-v[i]]f[i][j]=f[i?1][j]+f[i?1][j?v[i]]
剩下的錢小于第iii道菜的價格時,f[i][j]=f[i?1][j]f[i][j]=f[i-1][j]f[i][j]=f[i?1][j]
可以壓縮為一維DPDPDP:f[j]+=f[j?v[i]]f[j]+=f[j-v[i]]f[j]+=f[j?v[i]]
解讀為:當前花費情況下的點菜可能數,對于每道菜,包含點這個菜和不點這個菜的兩種可能數之和。
AC代碼(Java語言描述)
import java.io.IOException; import java.util.Scanner;public class Main {public static void main(String[] args) throws IOException {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt(), m = scanner.nextInt();int[] nums = new int[n];for (int i = 0; i < n; i++) {nums[i] = scanner.nextInt();}scanner.close();int[] result = new int[m+1];result[0] = 1;for (int i : nums) {for (int j = m; j >= i; j--) {result[j] += result[j-i];}}System.out.println(result[m]);} }總結
以上是生活随笔為你收集整理的小A点菜(洛谷P1164题题解,Java语言描述)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据结构与算法】顺序表V3.0的Jav
- 下一篇: 【Servlet】Servlet声明配置