AtCoder Beginner Contest 219 D - Strange Lunchbox

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder Beginner Contest 219 D - Strange Lunchbox相关的知识,希望对你有一定的参考价值。

D

问当A至少x个,B至少y个的最小方案数。
定义dp[i][j]位A有i个,B有j个的最小方案数。然后枚举。
因为问的是至少,所以要遍历A从x,B从y开始到300的所有答案。因为可能没有刚好到达x y(如样例1).

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define pb push_back
#define fi first
#define se second
#define mem(a,x) memset(a,x,sizeof(a));
#define db double 

//======================
const int N=310;
int a[N],b[N];int x,y;
int dp[N][N];//dp[i][j] 表示 大于等于i个A和大于等于j个B的最小方案数 
int main()
{
	int n;cin>>n;
	cin>>x>>y;
	for(int i=0;i<n;i++)
	{
		cin>>a[i]>>b[i];
	}
	mem(dp,0x3f3f3f3f);
	dp[0][0]=0;
	for(int i=0;i<n;i++)
	{
		for(int j=300;j>=0;j--)
		{
			for(int k=300;k>=0;k--)
			{
				dp[j][k]=min(dp[j][k],1+dp[max(0,j-a[i])][max(0,k-b[i])]);
				//防止访问a[-1]
			}
		}
	}
	
	int ans=0x3f3f3f3f;
	for(int i=x;i<=300;i++)
	{
		for(int j=y;j<=300;j++)
		{
			ans=min(ans,dp[i][j]);
		}
	}
	
	if(ans==0x3f3f3f3f) cout<<-1;
	else cout<<ans;
	return 0; 
}

以上是关于AtCoder Beginner Contest 219 D - Strange Lunchbox的主要内容,如果未能解决你的问题,请参考以下文章

AtCoder Beginner Contest 234

AtCoder Beginner Contest 115 题解

AtCoder Beginner Contest 154 题解

AtCoder Beginner Contest 103

AtCoder Beginner Contest 228

AtCoder Beginner Contest 242