天天看點

算法----背包問題1.    算法訓練 開心的金明 

1.    算法訓練 入學考試 

時間限制:1.0s   記憶體限制:256.0MB

送出此題   錦囊1   錦囊2   檢視參考代碼

問題描述

  辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了一個難題。醫師把他帶到一個到處都是草藥的山洞裡對他說:“孩子,這個山洞裡有一些不同的草藥,采每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡,你可以采到一些草藥。如果你是一個聰明的孩子,你應該可以讓采到的草藥的總價值最大。”

  如果你是辰辰,你能完成這個任務嗎?

輸入格式

  第一行有兩個整數T(1 <= T <= 1000)和M(1 <= M <= 100),用一個空格隔開,T代表總共能夠用來采藥的時間,M代表山洞裡的草藥的數目。接下來的M行每行包括兩個在1到100之間(包括1和100)的整數,分别表示采摘某株草藥的時間和這株草藥的價值。

輸出格式

  包括一行,這一行隻包含一個整數,表示在規定的時間内,可以采到的草藥的最大總價值。

樣例輸入

70 3

71 100

69 1

1 2

樣例輸出

3

資料規模和約定

  對于30%的資料,M <= 10;

  對于全部的資料,M <= 100。

import java.util.Scanner;

public class Main {   

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		int M = sc.nextInt();
		int i,j;
		int[] t = new int[M+1];
		int[] m = new int[M+1];
		
		for(i=0;i<M;i++){
			t[i]=sc.nextInt();
			m[i]=sc.nextInt();
		}
		//以上為輸入,下面是解題的核心
		int[] tag = new int[T+1];
		for(i=0;i<M;i++){
			for(j=T;j>0;j--){
				if(j >= t[i]){
					if(tag[j-t[i]] + m[i] > tag[j]){
						tag[j] = tag[j-t[i]] + m[i];
					}
				}
			}
		}
		System.out.println(tag[T]);
	}

}
           

1.    算法訓練 開心的金明 

時間限制:1.0s   記憶體限制:256.0MB

送出此題   錦囊1   錦囊2   檢視參考代碼

問題描述

  金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:“你的房間需要購買哪些物品,怎麼布置,你說了算,隻要不超過N元錢就行”。今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的N元。于是,他把每件物品規定了一個重要度,分為5等:用整數1~5表示,第5等最重要。他還從網際網路上查到了每件物品的價格(都是整數元)。他希望在不超過N元(可以等于N元)的前提下,使每件物品的價格與重要度的乘積的總和最大。

  設第j件物品的價格為v[j],重要度為w[j],共選中了k件物品,編号依次為 j1,j2,……,jk,則所求的總和為:

  v[j1]*w[j1]+v[j2]*w[j2]+ …+v[jk]*w[jk]。(其中*為乘号)

  請你幫助金明設計一個滿足要求的購物單。

輸入格式

  輸入檔案的第1行,為兩個正整數,用一個空格隔開:

  N m

  (其中N(<30000)表示總錢數,m(<25)為希望購買物品的個數。)

  從第2行到第m+1行,第j行給出了編号為j-1的物品的基本資料,每行有2個非負整數

  v p

  (其中v表示該物品的價格(v<=10000),p表示該物品的重要度(1~5))

輸出格式

  輸出檔案隻有一個正整數,為不超過總錢數的物品的價格與重要度乘積的總和的最大值(<100000000)。

樣例輸入

1000 5

800 2

400 5

300 5

400 3

200 2

樣例輸出

3900

import java.util.Scanner;

public class Main {   

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N=sc.nextInt();
		int m = sc.nextInt();
		int i,j;
		int[] v = new int[m+1];
		int[] p = new int[m+1];
		for(i=0;i<m;i++){
			v[i] = sc.nextInt();
			p[i] = sc.nextInt();
		}
		
		int[] tag = new int[N+1];
		for(i=0;i<m;i++)
			for(j=N;j>0;j--)
				if(j>=v[i]){
					if(tag[j-v[i]] + v[i]*p[i] > tag[j]){
						tag[j] = tag[j-v[i]] + v[i]*p[i];
					}
				}
		System.out.println(tag[N]);
	}

}
           

換一種輸入:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {   

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] str = br.readLine().split(" ");
		int N = Integer.parseInt(str[0]);
		int m = Integer.parseInt(str[1]);
		int[][] arr = new int[m+1][2];
		int i,j;
		for(i=0;i<m;i++){
			String[] order = br.readLine().split(" ");
			arr[i][0] = Integer.parseInt(order[0]);
			arr[i][1] = Integer.parseInt(order[1]);
		}
		
		int[] tag = new int[N+1];
		for(i=0;i<m;i++){
			for(j=N;j>0;j--){
				if(j>=arr[i][0]){
					if(tag[j-arr[i][0]] + arr[i][0]*arr[i][1] > tag[j]){
						tag[j] = tag[j-arr[i][0]] + arr[i][0]*arr[i][1];
					}
				}
			}
		}
		System.out.println(tag[N]);
	}

}
           

繼續閱讀