[刷題]【2019/10/10】USACO簡單DP④題:P2925Hay For Sale+P3009Profits+P2871Charm Bracelet+P2639

本來有一道題有點小問題,想着記錄一下,順便歸類一下。沒想到這幾道都是模板題。

P2925 [USACO08DEC]乾草出售Hay For Sale

?乾草出售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

?Bessie的體重問題

和上面一樣的問題

#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

?利潤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

?手鍊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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章