[蓝桥杯2021初赛] 路径与砝码称重

路径 

小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径。
小蓝的图由2021 个结点组成,依次编号1 至2021。
对于两个不同的结点a, b,如果a 和b 的差的绝对值大于21,则两个结点之间没有边相连;
如果a 和b 的差的绝对值小于等于21,则两个点之间有一条长度为a 和b 的最小公倍数的无向边相连。
例如:结点1 和结点23 之间没有边相连;结点3 和结点24 之间有一条无向边,长度为24;
结点15 和结点25 之间有一条无向边,长度为75。
请计算,结点1 和结点2021 之间的最短路径长度是多少。
提示:建议使用计算机编程解决问题。

#include <iostream>
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;


int gcd(int x,int y)
{
    return !y ? x : gcd(y, x % y);
}

int main()
{
    int f[2022];
    memset(f, 0, sizeof f);
    for(int i = 1;i <= 2021;i++) 
    {
        for(int j = i + 1; j <= i + 21; j ++) 
        {
            if(j > 2021)
                break;
            if(f[j] == 0)
                f[j] = f[i] + j * i / gcd(i, j);
            else    
                f[j] = min(f[j], f[i] + j * i / gcd(i, j));
        }
    }
    cout << f[2021] << endl;
    
    return 0;
}

砝码称重

题目描述

你有一架天平和N 个砝码,这N 个砝码重量依次是W1, W2, ... , WN。
请你计算一共可以称出多少种不同的重量?
注意砝码可以放在天平两边。

输入格式

输入的第一行包含一个整数N。
第二行包含N 个整数:W1, W2, W3, ... , WN。
对于50% 的评测用例,1 ≤ N ≤ 15。
对于所有评测用例,1 ≤ N ≤ 100,N 个砝码总重不超过100000。
 

输出格式

输出一个整数代表答案。

输入样例 

3
1 4 6

输出样例 

10
#include <iostream>
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int dp[102][100005]={0};
int w[102];
int n;
int sum = 0;

int main()
{
    scanf("%d",&n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d",&w[i]);
        sum += w[i];
    }

    dp[0][0] = 1;
    for (int i = 1; i <= n; i++)
        for (int j = 0; j <= sum; j++)
            dp[i][j] = dp[i - 1][abs(j - w[i])] + dp[i - 1][j + w[i]] +dp[i - 1][j];

    int ans = 0;

    for (int i = 1; i <= sum; i++)
        if (dp[n][i] != 0)
            ans++;

    printf("%d",ans);
    return 0;
}

扫描二维码关注公众号,回复: 14169373 查看本文章

猜你喜欢

转载自blog.csdn.net/aasd23/article/details/124934062
今日推荐