1. 程式人生 > >2075 Problem G 點菜問題

2075 Problem G 點菜問題

問題 G: 點菜問題

時間限制: 1 Sec  記憶體限制: 32 MB
提交: 49  解決: 33
[提交][狀態][討論版][命題人:外部匯入]

題目描述

北大網路實驗室經常有活動需要叫外買,但是每次叫外買的報銷經費的總額最大為C元,有N種菜可以點,經過長時間的點菜,網路實驗室對於每種菜i都有一個量化的評價分數(表示這個菜可口程度),為Vi,每種菜的價格為Pi, 問如何選擇各種菜,使得在報銷額度範圍內能使點到的菜的總評價分數最大。
    注意:由於需要營養多樣化,每種菜只能點一次。

輸入

輸入的第一行有兩個整數C(1 <= C <= 1000)和N(1 <= N <= 100),C代表總共能夠報銷的額度,N>代表能點菜的數目。接下來的N行每行包括兩個在1到100之間(包括1和100)的的整數,分別表示菜的>價格和菜的評價分數。

輸出

輸出只包括一行,這一行只包含一個整數,表示在報銷額度範圍內,所點的菜得到的最大評價分數。

樣例輸入

1 3
1 5
3 3
2 5
24 8
2 9
8 6
4 1
1 4
2 2
10 5
2 1
1 4

樣例輸出

5
30
#include<iostream>
#include<algorithm>
using namespace std;
//同01揹包
int main() {
	int C, N;
	while (cin >> C >> N) {
		int dp[10000] = { 0 }, p, v;
		for (int i = 0; i < N; i++) {
			cin >> p >> v;//菜價,評價分數
			for (int j = C; j >= p; j--) {
				dp[j] = max(dp[j], dp[j - p] + v);
			}
		}
		cout << dp[C] << endl;
	}
	return 0;
}