DP经典题

1.分苹果

n 只奶牛坐在一排,每个奶牛拥有 a i a_i ai 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出 -1。
输入描述:
每个输入包含一个测试用例。每个测试用例的第一行包含一个整数 n(1 <= n <= 100),接下来的一行包含 n 个整数 a i a_i ai(1 <= a i a_i ai <= 100)。
输出描述:
输出一行表示最少需要移动多少次可以平分苹果,如果方案不存在则输出 -1。
示例1
输入
4
7 15 9 5
输出
3

苹果总数不能被均分时,不成立
平均数减去每头牛的苹果数不是二的倍数时,不成立
最后只需要记录苹果数小于平均数的牛的移动次数即可

#include <iostream>
using namespace std;

int a[105];

int main(void)
{
   
	int n, ave = 0, ans = 0;
	cin >> n;
	for (int i = 1; i <= n; i++){
   
		cin >> a[i];
		ave += a[i];
	}
	bool flag = 1;
	if (ave % n != 0)
		flag = 0;
	else{
   
		ave /= n;
		for (int i = 1; i <= n; i++){
   
			int d = ave - a[i];
			if (d % 2 != 0)
				flag = 0;
			else if (d > 0)
				ans += d / 2;
		}
	}
	if (flag)
		cout << ans << endl;
	else
		cout << "-1" << endl;
	
	return 0;
}

2.拼凑面额

给你六种面额1、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0-10000的非负整数)的不同组合的个数。

链接:https://www.nowcoder.com/questionTerminal/14cf13771cd840849a402b848b5c1c93?orderByHotValue=0&commentTags=Python
来源:牛客网
输入描述:
输入为一个数字N,即需要拼凑的面额
输出描述:
输出也是一个数字,为组成N的组合个数。
示例1
输入
5
输出
2

完全背包求组合数问题,一般是将max改为相加即可。
当组成5000时,答案会超出int,需要设为long long。
dp[i][j]表示用前i种纸币来组成j,记得要将dp[0][0]初始化为1。

#include<stdio.h>

int w[]={
   1,5,10,20,50,100};
long long dp[10][10005];

int main(void)
{
   
	int W;
	scanf("%d",&W);
	dp[0][0]=1;
	for(int i=0;i<6;i++)
		for(int j=0;j<=W;j++)
		{
   
			if(j<w[i])
				dp[i+1][j]=dp[i][j];
			else
				dp[i+1][j]=dp[i][j]+dp[i+1][j-w[i]];
		}
	printf("%lld\n",dp[6][W]);
	return 0;
}

3.矩形覆盖

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

链接:https://www.nowcoder.com/questionTerminal/72a5a919508a4251859fb2cfb987a0e6
来源:牛客网

在牛客上找到的题解,讲解的很清楚,这道题就是斐波那契。
在这里插入图片描述

4.连续子数组的最大和

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)

链接:https://www.nowcoder.com/questionTerminal/459bd355da1549fa8a49e350bf3df484
来源:牛客网

class Solution {
   
public:
    int res = -0x3f3f3f3f, maxv = -0x3f3f3f3f;
    int FindGreatestSumOfSubArray(vector<int> array) {
   
        int n = array.size();
        for (int i = 0; i < n; i++){
   
            if (maxv >= 0)
                maxv += array[i];
            else
                maxv = array[i];
            res = max(res, maxv);
        }
        return res;
    }
};

5.斐波那契凤尾

NowCoder号称自己已经记住了1-100000之间所有的斐波那契数。
为了考验他,我们随便出一个数n,让他说出第n个斐波那契数。当然,斐波那契数会很大。因此,如果第n个斐波那契数不到6位,则说出该数;否则只说出最后6位。

链接:https://www.nowcoder.com/questionTerminal/c0a4b917a15f40a49ca10532ab9019fb?orderByHotValue=1&pos=1
来源:牛客网
输入描述:
输入有多组数据。每组数据一行,包含一个整数n (1≤n≤100000)。

输出描述:
对应每一组输入,输出第n个斐波那契数的最后6位。

示例1
输入
1234100000

输出
1235537501

WA到自闭的一道题,一看是斐波那契,就没仔细看,没想到这题暗藏玄机啊

#include<stdio.h>

int n,t,arr[100005];

int main(void)
{
   
	arr[1]=1;arr[2]=2;
	for(int i
  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值