由于高數巨養的喵星人太傲嬌了,要天天吃新鮮貓糧而且還經常欺負高數巨,所以高數巨決定買幾條哈士奇嘗嘗鮮。這天高數巨來到了二手狗市場買哈士奇,高數巨看完了所有的哈士奇,記下了每條哈士奇的價格,并根據對它們的好感程度給它們每只都賦予了一個萌值。高數現在手里有X元,她想通過購買若干條哈士奇來獲得盡可能多的萌值。現在給定高數巨手里的錢X以及N條哈士奇的價格和萌值,求高數巨最多可獲得多少萌值
多組輸入。
對于每組輸入,第一行有兩個整數N,X(1 < = N < = 100,1 < = X < = 1000),分別表示哈士奇的數量和高數巨的錢數
接下來的N行每行有兩個整數Pi,Mi(1 < = Pi,Mi < = 100),分別表示第i條哈士奇的價格和萌值
對于每組數據,輸出一個整數,表示高數巨最多可以獲得的萌值,每組輸出占一行
2 10050 2060 403 10020 5520 3590 951 1020 50Example Output
40950Hint
Author
Shannon
*******動態規劃問題:
0-1背包問題, 每種哈士奇的條數為1,不存在多個 。
公式:
sum[j] = max(sum[j-v[i]]+w[i], sum[j]);代碼實現:
#include <stdio.h>#include <stdlib.h>#include <string.h>int max(int a, int b){ if(a>=b) return a; else return b;}int main(){ int a, b, i, j; int sum[1113]; int v[116], w[116]; while(~scanf("%d %d", &a, &b)) { memset(sum, 0, sizeof(sum)); memset(w, 0, sizeof(w)); memset(v, 0, sizeof(v)); for(i=1;i<=a;i++) { scanf("%d %d", &v[i], &w[i]); } for(i=1;i<=a;i++) { for(j=b;j>=0;j--) { if(j>=v[i]) sum[j] = max(sum[j-v[i]]+w[i], sum[j]); } } printf("%d/n", sum[b]); } return 0;}
新聞熱點
疑難解答