本來有一道題有點小問題,想着記錄一下,順便歸類一下。沒想到這幾道都是模板題。
P2925 [USACO08DEC]乾草出售Hay For Sale
揹包問題
#include <iostream>
using namespace std;
int a[5001],dp[500001];
int C,H;
int ans = 0;
int main(){
cin >> C >> H;
for(int i = 1;i <= H;i++)
cin >> a[i];
for(int i = 1;i <= H;i++){
for(int j = C;j >= a[i];j--){
dp[j] = max(dp[j - a[i]] + a[i],dp[j]);
ans = ans > dp[j] ? ans : dp[j];
//max(dp[j],ans);
//用max函數的時候有一個測試點超時了,換了好了一點。
}
}
cout << ans;
return 0;
}
P2639 [USACO09OCT]Bessie的體重問題Bessie’s Weight
和上面一樣的問題
#include <iostream>
using namespace std;
int a[501],dp[45001];
int main(){
int H,N;
cin >> H >> N;
for(int i = 1;i <= N;i++)
cin >> a[i];
for(int i = 1;i <= N;i++){
for(int j = H;j >= a[i];j--){
dp[j] = max(dp[j],dp[j - a[i]] + a[i]);
}
}
cout << dp[H];
return 0;
}
P3009 [USACO11JAN]利潤Profits
最長連續子序列和
#include <iostream>
using namespace std;
const int MAXN = 100001;
int N;
int a[MAXN],dp[MAXN];
int ans = -99999999;
int main(){
cin >> N;
for(int i = 1;i <= N;i++)
cin >> a[i];
for(int i = 1;i <= N;i++){
dp[i] = (dp[i-1] + a[i]) > a[i] ? (dp[i-1] + a[i]) : a[i];
ans = ans > dp[i] ? ans : dp[i];
}
cout << ans;
return 0;
}
P2871 [USACO07DEC]手鍊Charm Bracelet
揹包問題
#include <iostream>
using namespace std;
const int MAXN = 3403;
int w[MAXN],c[MAXN],dp[12881];
int main(){
int N,M;
cin >> N >> M;
for(int i = 1;i <= N;i++)
cin >> c[i] >> w[i];
for(int i = 1;i <= N;i++){
for(int j = M;j >= c[i];j--){
dp[j] = max(dp[j],dp[j - c[i]] + w[i]);
}
}
cout << dp[M];
return 0;
}