给你n个硬币,请问你无法凑出的最小面值是多少?

第一行输入一个整数n,表示硬币个数
接下来输入n个整数,每个整数表示第i个硬币的面值
n≤1000,每个硬币面值≤10⁷

#include <iostream>
#include <algorithm>

using namespace std;

// 定义数组a,用于存储n个硬币的面值
int a[1001];

int gcd(int x, int y) {
    // 计算两个数的最大公约数
    if (y == 0) return x;
    return gcd(y, x % y);
}

int lcm(int x, int y) {
    // 计算两个数的最小公倍数
    return x * y / gcd(x, y);
}

int main() {
    int n;
    cin >> n;

    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }

    int ans = 1;
    for (int i = 0; i < n; i++) {
        ans = lcm(ans, a[i]);
    }

    cout << ans << endl;

    return 0;
}
#include <bits/stdc++.h>
using namespace std;
int a[101];
int slove(int left,int right)
{
    int i,j,sum1=0,sum2=0;
    int key;
    if(left==right)//一个数,直接返回
        return left+1;
    if(right-left==1)//就剩两个数
    {
        if(a[right]<a[left])
            return right+1;
        else
            return left+1;
    }
    if((right-left+1)%2==0)//偶数个
    {   //直接左右求和比较,然后分治递归
        key=(right+left)/2;
        for(i=left; i<=key; i++)
            sum1+=a[i];
        for(j=key+1; j<=right; j++)
            sum2+=a[j];
        if(sum1<sum2)
        {
            right=key;
            return slove(left,right);//向右递归
        }
        else
        {
            left=key+1;
            return slove(left,right);//向左递归
        }

    }
    else//奇数个
    {
        key=(right+left)/2;//首先考虑中间及左右两个
        if(a[key]>a[key-1])
            return key;
        else if(a[key]<a[key-1])
            return key+1;
        if(a[key]>a[key+1])
            return key+2;
        else if(a[key]<a[key+1])
            return key+1;
        //左右求和比较,然后分治递归
        for(i=left; i<key; i++)
            sum1+=a[i];
        for(j=key+1; j<=right; j++)
            sum2+=a[j];
        if(sum1<sum2)
        {
            right=key-1;
            return slove(left,right);//向右递归
        }
        else
        {
            left=key+1;
            return slove(left,right);//向左递归
        }
    }
}
int main()
{
    int n,i;
    cin>>n;
    for(i=0; i<n; i++)
        cin>>a[i];
    cout<<slove(0,n-1)<<endl;
    return 0;
}




#include <bits/stdc++.h>
using namespace std;
 
#define INF 0x3f3f3f3f
 
int dp[20020];
int main()
{
    int n, m;
    cin >> n;
    int coins[n]; //硬币个数
    int value[n]; //硬币面值
 
    for (int i = 0; i < n; i++)
    {
        cin >> value[i] >> coins[i];
    }
 
    cin >> m;
    for (int i = 1; i <= m; i++)
    {
        dp[i] = INF; //赋极大值,表示不可达
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 1; j <= coins[i]; j++)
        { //遍历硬币数量
            for (int k = m; k >= value[i]; k--)
            {
                dp[k] = min(dp[k], dp[k - value[i]] + 1);
            }
        }
    }
    cout << (dp[m] < m ? dp[m] : -1) << endl;
    system("pause");
}

是嘉姐吗

代码如下, 理解是如下测试
输入1
3
1 2 3 那么最小值是7
输入2
2
1 3,那么最小是2

#include <iostream>
using namespace std;

int main()
{
    int minst = 0, maxst = 0;
    int coin[1002];
    int n, i,j, v;
    int f[2022] = {0};

    cin>>n;
    for(i = 1; i<=n; i++) {
        cin>>coin[i];
        if(minst == 0) minst = coin[i];
        else {if(minst > coin[i]) minst = coin[i];}
        maxst += coin[i];
    }
    if(maxst+1 >= 2022) {cout << "coin is big" << endl; return 0;}

    for(v = minst + 1; v <= maxst+1; v++) {
        for(i = 1; i <= n; i++) {
            for(j = v; j>=coin[i]; j--) {
                 f[j]=max(f[j],f[j-coin[i]]+coin[i]);
            }
        }
        if(f[v] != v) break;
        for(i = 0; i < 2022; i++) f[i] = 0;
    }

    cout << "min is " << v << endl;
    
    return 0;
}