第一行输入一个整数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;
}