D - Strange Lunchbox(背包)

Posted Harris-H

tags:

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

D - Strange Lunchbox(背包)

01背包的变形,考虑令 d p ( i , j ) dp(i,j) dp(i,j)表示容量一 ≥ i \\ge i i且容量二 ≥ j \\ge j j的最小个数。

然后按照01背包转移即可。注意判无解。

时间复杂度: O ( n m 2 ) O(nm^2) O(nm2)

// Problem: D - Strange Lunchbox
// Contest: AtCoder - Sciseed Programming Contest 2021(AtCoder Beginner Contest 219)
// URL: https://atcoder.jp/contests/abc219/tasks/abc219_d
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// Date: 2021-09-22 11:35:17
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=5e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(nullptr) 
void Print(int *a,int n){
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 
}
int dp[N][N],n;
int x,y;
PII a[N];
int main(){
	scanf("%d%d%d",&n,&x,&y);
	rep(i,1,n){
		scanf("%d%d",&a[i].x,&a[i].y);
	}
	mst(dp,0x3f);
	dp[0][0]=0;
	rep(i,1,n){
		for(int j=x;~j;j--)
			for(int k=y;~k;k--)
				dp[j][k]=min(dp[j][k],dp[max(j-a[i].x,0)][max(k-a[i].y,0)]+1);
	}
	if(dp[x][y]==inf) dp[x][y]=-1;
	printf("%d\\n",dp[x][y]);
	return 0;
}

以上是关于D - Strange Lunchbox(背包)的主要内容,如果未能解决你的问题,请参考以下文章

Strange Towers of Hanoi (POJ1958)

Codeforces 1190D. Tokitsukaze and Strange Rectangle

用 Lunchbox 在 vue3 中创建一个旋转的 3D 地球竟是如此简单

Codeforces Round #694 (Div. 2)D.Strange Definition

Codeforces Round #694 (Div. 2)D.Strange Definition

[POJ1958]Strange Towers of Hanoi