【動的分類】01バックパック付属品:ジンミンの調達計画

i番目の主要コンポーネントに到達したと仮定すると、現在5つの選択肢があります。

(1)何も買わない(2)本体だけを買う(3)本体とアタッチメント1を買う(4)本体とアタッチメント2を買う(5)本体とアタッチメント1とアタッチメント2を買う

データ構造の設計:

2次元配列v[i][0]、v [i] [1]、v [i] [2]を使用して、i番目のメインピースの値、i-の最初のアクセサリの値を表します。 i番目のメインピースの最初のアクセサリの値、およびi番目のメインピースのメインパーツと2番目のアクセサリの値。

2次元配列w[i][0]、w [i] [1]、w [i] [2]を使用して、i番目の主要コンポーネントの重要性とi-の最初のアクセサリの重要性を表します。主要コンポーネント、i番目の主要コンポーネントの2番目のアクセサリの重要性。

dp [i] [j]:jの場合の最初のi個の主要コンポーネントの最大値を表します

dp [i] [j] = max(dp [i-1] [j]、

dp [i-1] [jv [i] [0]] + v [i] [0] * w [i] [0]、

dp [i-1] [jv [i] [0] -v [i] [1]] + v [i] [0] * w [i] [0] + v [i] [1] * w [ i] [1]、

dp [i-1] [jv [i] [0] -v [i] [2]] + v [i] [0] * w [i] [0] + v [i] [2] * w [ i] [2]、

dp [i-1] [jv [i] [0] -v [i] [1] -v [i] [2]] + v [i] [0] * w [i] [0] + v [ i] [1] * w [i] [1] + v [i] [2] * w [i] [2])

#include<iostream>
using namespace std;
int dp[32001];
int v0[61];
int p0[61];
int v1[61];
int p1[61];
int v2[61];
int p2[61];
int n,m;
int main(){
	cin>>n>>m;
	int v,p,q;
	int cnt=1;
	for(int i=1;i<=m;i++){
		cin>>v>>p>>q;
		if(q==0){
			v0[i]=v;
			p0[i]=p;
		}
		else if(v1[q]==-1)
			{
			v1[q]=v;
			p1[q]=p;
		}
		else{
			v2[q]=v;
			p2[q]=p;
		}
	}
	for(int i=1;i<=m;i++){
		for(int j=n;j>=v0[i]&&v0[i]!=0;j--){
			if(j>=v0[i]){
				dp[j]=max(dp[j],dp[j-v0[i]]+v0[i]*p0[i]);}
			else if(j>=v0[i]+v1[i]){
				dp[j]=max(dp[j],dp[j-v0[i]-v1[i]]+v0[i]*p0[i]+v1[i]*p1[i]);}
			else if(j>=v0[i]+v2[i]){
				dp[j]=max(dp[j],dp[j-v0[i]-v2[i]]+v0[i]*p0[i]+v2[i]*p2[i]);
			}
			else if(j>=v0[i]+v1[i]+v2[i]){
				dp[j]=max(dp[j], dp[j - v1[i]- v0[i]- v2[i]]+v0[i]*p0[i]+v1[i]*p1[i]+v2[i]*p2[i]);
			}
			}			
		}
	cout<<dp[n];
}

おすすめ

転載: blog.csdn.net/m0_52043808/article/details/123977029