01揹包-01 高數Umaru系列(9)——哈士奇
阿新 • • 發佈:2018-12-23
高數奧馬魯系列(9) - 哈士奇
時間限制:1000毫秒記憶體限制:65536 KiB
問題描述
由於高數巨養的喵星人太傲嬌了,要天天吃新鮮貓糧而且還經常欺負高數巨,所以高數巨決定買幾條哈士奇嚐嚐鮮。這天高數巨來到了二手狗市場買哈士奇,高數巨看完了所有的哈士奇,記下了每條哈士奇的價格,並根據對它們的好感程度給它們每隻都賦予了一個萌值。高數現在手裡有X元,她想通過購買若干條哈士奇來獲得儘可能多的萌值。現在給定高數巨手裡的錢X以及ñ條哈士奇的價格和萌值,求高數巨最多可獲得多少萌值
輸入
多組輸入。
對於每組輸入,第一行有兩個整數N,X(1 <= N <= 100,1 <= X <= 1000),分別表示哈士奇的數量和高數巨的錢數
接下來的N行每行有兩個整數Pi,Mi(1 <= Pi,Mi <= 100),分別表示第i條哈士奇的價格和萌值
產量
對於每組資料,輸出一個整數,表示高數巨最多可以獲得的萌值,每組輸出佔一行
樣本輸入
2 100
50 20
60 40
3 100
20 55
20 35
90 95
1 10
20 50
樣本輸出
40
95
0
暗示
資源
夏農
AC程式碼:二維陣列
#include <bits/stdc++.h> using namespace std; int a[111],b[111]; int main() { int n,x; while (cin>>n>>x) { int dp[111][1111]={0}; for (int i=1;i<=n;i++) cin>>a[i]>>b[i]; for (int i=1;i<=n;i++) { for (int j=x;j>0;j--) { if (j>=a[i]) // 能裝 dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+b[i]); // 比較裝與不裝誰的價值更大 else // 裝不進 dp[i][j]=dp[i-1][j]; } } cout<<dp[n][x]<<endl; } return 0; }
AC程式碼:二維換一維
#include <bits/stdc++.h> using namespace std; int dp[1111]; int a[111], b[111]; int main() { int n, x; while (~scanf("%d %d", &n, &x)) { memset(dp, 0, sizeof(dp)); // 少重置錯 for (int i = 0; i < n; i++) { scanf("%d %d", &a[i], &b[i]); } for (int i = 0; i < n; i++) // 遍歷哈士奇個數 { for (int j = x; j >= 0; j--) // 遍歷剩餘的錢 { if (j - a[i] >= 0) { dp[j] = max(dp[j], dp[j - a[i]] + b[i]); } } } printf("%d\n", dp[x]); } return 0; }