レンジャーズは、西洋メール(01リュックサックの変形)のフリントの断片を見つけます

タイトル説明
木星の重力の影響により、我々はすべて知っているように、世界中の推進エンジンを再起動する必要があります。今、あなたはフリントの断片を収集しようと、西洋のメールは、エンジンを再起動し、緊急のタスクを受け取ります。今フリント破片が希少資源となっている、フリントチップはお金を必要とするか、またはいくつかのポイントを取ります。異なるサイズのフリントフラグメントは、より大きな、断片化エネルギーより大きなエネルギーフリントフラグメントは、エンジン推力が強くを再起動します。しかし、私たちの努力うん、隣師範大学で、法律だけでなく、大学都市長安区を代表して世界に貢献できる最大の大学のエンジン推力の再始動、エンジンと政治学ノーマルエンジンを再始動するために破片のコレクションでもあります、歴史の本に足跡を残します。
今、あなたはお金のV1、自由(フリーポイント)のためv2のポイントは今、n個のフリント断片の合計をk個のフリントの断片を集めている、それぞれの断片は、お金やポイントBを必要とする、フラグメントのエネルギーがvalのです。私たちは、できるだけ大きくフリントチップ、エネルギーの合計を収集したい、あなたは最大エネルギー合計は数ある取得するまでskyer_hxx頼みますか?

入力
入力は、テストケースの複数のセットが含まれています。
、各データの最初の行は、4つの整数n、V1、V2、kは
含まれ、三つの整数、bは次いでn行、それぞれのVal、各フラグメントの価格、必要なポイントを引き換えますエネルギー。
1≤n≤100
0≤v1、v2≤100
0≤k≤5
0≦A、B、val≤100

出力
各試験について、出力電力の最大値を求めることができます。

サンプル入力は、
サンプルデータを複製する
。4. 5. 1 2
2 2 4
4 5 1
4 4 2
2 2 5
サンプル出力
14

アイデア:各断片が一つだけを選択することができ、01バックパックの変形は、下降トラバースする必要があることは明らかである
[J] [K] [DPを m]は、Jのためのお金の量を表すk個のポイント、デブリの自由残りのm個場合の最大値。
トリプルループ、最大の価値を見つけます。

#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int N = 105;
int a[N];
int b[N];
int v[N];
int dp[N][N][10];
int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		int x,v1,v2;
		memset(dp,0,sizeof(dp));
		scanf("%d%d%d",&v1,&v2,&x);
		for(int i=1;i<=n;i++)
			scanf("%d%d%d",&a[i],&b[i],&v[i]);
		for(int i=1;i<=n;i++)  //枚举每种物品
			for(int j=v1;j>=0;j--)  //枚举钱数
				for(int k=v2;k>=0;k--)  //枚举积分数
					for(int m=x;m>=0;m--)  //枚举剩余碎片数
					{
						if(j>=a[i])    //注意不能在循环中加这三个判断条件,因为判断条件并不唯一,在钱数不足的情况下可以用积分或者免费碎片机会来获得该价值
							dp[j][k][m]=max(dp[j][k][m],dp[j-a[i]][k][m]+v[i]);
						if(k>=b[i])
							dp[j][k][m]=max(dp[j][k][m],dp[j][k-b[i]][m]+v[i]);
						if(m>=1)
							dp[j][k][m]=max(dp[j][k][m],dp[j][k][m-1]+v[i]);
					}
		cout<<dp[v1][v2][x]<<endl;
	}
	
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_43693379/article/details/94391794