Phoenix and Berries(2400/dp)

题目
参考
题意:给定 n n n棵树,每棵树有 a i a_i ai个红果子, b i b_i bi个蓝果子,给定篮子大小为 k k k,同一棵树的果子,或者同种颜色的果子,可以放在同一篮子。问最多可以装满多少大小为 k k k的篮子。 1 < = n , k < = 500 , 0 < = a i , b i < = 1 e 9 1<=n,k<=500,0<=a_i,b_i<=1e9 1<=n,k<=500,0<=ai,bi<=1e9
题解:根据数据范围,我们可以发现混合色篮子数,相对纯色篮子数,要少的多,混合色篮子,最多可以保持 n n n个,因为同一棵树上的果子,如果混合色篮子超过1个,我们完全可以把他分成若干个纯色篮子。
d p [ i ] [ j ] dp[i][j] dp[i][j]表示当前到第 i i i棵树时,红色苹果数剩下 j j j个时,能得到的最大篮子数,剩下的蓝色苹果数可以由剩下的红色苹果数推算出来 b = s u m − d p [ i ] [ j ] − j b=sum-dp[i][j]-j b=sumdp[i][j]j,我们根据当前的 d p [ i ] [ j ] dp[i][j] dp[i][j],枚举下一棵树用来凑混合篮子的红色苹果数 r r r,就可以推出下一颗树其对应的剩余红色苹果数的最大篮子树,如下

int b2 = b + blue[i] - (k-r);
int r2 = j + red[i] - r;
dp[i][r2%k] = max(dp[i][r2%k],dp[i][j]+b2/k+r2/k+1);

注意考虑下一棵树,不凑混合篮子的情况

int b2 = b + blue[i];
int r2 = j + red[i];
dp[i][r2%k] = max(dp[i][r2%k],dp[i][j]+b2/k+r2/k);

最后答案就是 m a x ( d p [ n ] [ i ] ) max(dp[n][i]) max(dp[n][i]),由于 d p dp dp转移时只与上一层有关,还可以进一步空间优化。
代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 510;


ll dp[maxn][maxn];
int red[maxn],blue[maxn];
int n,k;

int main() {
	scanf("%d%d",&n,&k);
	for(int i = 1;i <= n;++i) {
		scanf("%d%d",&red[i],&blue[i]);
	}
	memset(dp,-1,sizeof(dp));
	dp[0][0] = 0;
	ll sum = 0;
	for(int i = 1;i <= n;++i) {
		for(int j = 0;j < k;++j) {
			if(dp[i-1][j] != -1) {
				int b = sum - dp[i-1][j]*k - j;
				for(int r = max(1,k-blue[i]);r < k && r <= red[i];++r) {
					int b2 = b + blue[i] - (k-r);
					int r2 = j + red[i] - r;
					dp[i][r2%k] = max(dp[i][r2%k],dp[i-1][j]+b2/k+r2/k+1);
				}
				int b2 = b + blue[i];
				int r2 = j + red[i];
				dp[i][r2%k] = max(dp[i][r2%k],dp[i-1][j]+b2/k+r2/k);
			}
		}
		sum += red[i]+blue[i];
	}
	ll ans = 0;
	for(int i = 0;i < k;++i)
		 ans = max(ans,dp[n][i]);
	printf("%I64d\n",ans);
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux环境下使用Python编写贪吃蛇游戏,你可以使用pygame库来实现。首先,你需要安装pygame库,可以使用以下命令来安装: ``` pip install pygame ``` 接下来,你可以使用以下代码来编写贪吃蛇游戏: ```python import pygame import keyboard import pickledb # 初始化 pygame.init() screen = pygame.display.set_mode((500, 500)) pygame.display.set_caption('Greedy Snake') # 设定Surface,变量和显示数字的坐标 body = pygame.Surface((20, 20)) body.fill('yellow') berries = pygame.Surface((20, 20)) berries.fill('red') block = pygame.Surface((4, 4)) T = 0 db = pickledb.load('Mark.db', False) HI = db.get('HiMark') B = False # 键盘捕获函数 def keyname(key): global KEY KEY = key.name keyboard.on_press(keyname) # 游戏循环 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() # 游戏逻辑代码 # 渲染代码 pygame.display.update() ``` 这是一个基本的贪吃蛇游戏框架,你可以根据自己的需求添加游戏逻辑和渲染代码。注意,这只是一个示例代码,你可能需要根据自己的需求进行修改和完善。 #### 引用[.reference_title] - *1* *2* [教你用322行Python代码编写贪吃蛇](https://blog.csdn.net/AlexHu2022/article/details/127139815)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值