洛谷P1048 - 採藥 - 01揹包
阿新 • • 發佈:2021-10-10
洛谷P1048 -採藥
題目描述
辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了一個難題。醫師把他帶到一個到處都是草藥的山洞裡對他說:“孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡,你可以採到一些草藥。如果你是一個聰明的孩子,你應該可以讓採到的草藥的總價值最大。”
如果你是辰辰,你能完成這個任務嗎?
輸入格式
第一行有2個整數T(1≤T≤1000)和M(1≤M≤100),用一個空格隔開,T代表總共能夠用來採藥的時間,M代表山洞裡的草藥的數目。
接下來的M行每行包括兩個在1到100之間(包括1和100)的整數,分別表示採摘某株草藥的時間和這株草藥的價值。
輸出格式
輸出在規定的時間內可以採到的草藥的最大總價值。
解決方案:典型的01揹包問題
package dp; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; /** * * 解決方案:0-1揹包問題 * @author XA-GDD * */ public class P1048_Herbalism { static int T,M; static int [] w = new int[102]; static int [] v = new int[102]; static int [] dp = new int[1002]; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); T = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); for(int i=1;i<=M;i++) { st = new StringTokenizer(br.readLine()); w[i] = Integer.parseInt(st.nextToken()); v[i] = Integer.parseInt(st.nextToken()); } for(int i=1;i<=M;i++) { for(int j=T;j>=w[i];j--) { dp[j] = Math.max(dp[j], dp[j-w[i]]+v[i]); } } System.out.println(dp[T]); } }