硬币题解
大意开门:有一个数x,有n个硬币,要求这n个硬币中选几个硬币和为x,这些组合中每次都重复用的数是多少
代码飞来:
#include<cstdio>
#include<cstring>
using namespace std;
int f[11000],a[210],b[210];
int main()
{
int n,m,ans=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int t=1;t<=n;t++)
{
memset(f,0,sizeof(f));f[0]=1;
for(int i=1;i<=n;i++)
{
if(i!=t)
{
for(int j=m;j>=a[i];j--)f[j]+=f[j-a[i]];//这是求除去t号硬币,剩下的硬币和为m的组合方案
}
}
if(f[m]==0)
//这里是指除去t号硬币,剩下不能组成m,那么t号硬币肯定必选(因为题目说了至少有一种组合超过x元)
{
b[++ans]=t;//记录编号t
}
}
printf("%d\n",ans);
for(int i=1;i<ans;i++)printf("%d ",a[b[i]]);
if(ans>0)printf("%d",a[b[ans]]);
printf("\n");
return 0;
}
大意开门:有一个数x,有n个硬币,要求这n个硬币中选几个硬币和为x,这些组合中每次都重复用的数是多少
代码飞来:
#include<cstdio>
#include<cstring>
using namespace std;
int f[11000],a[210],b[210];
int main()
{
int n,m,ans=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int t=1;t<=n;t++)
{
memset(f,0,sizeof(f));f[0]=1;
for(int i=1;i<=n;i++)
{
if(i!=t)
{
for(int j=m;j>=a[i];j--)f[j]+=f[j-a[i]];//这是求除去t号硬币,剩下的硬币和为m的组合方案
}
}
if(f[m]==0)
//这里是指除去t号硬币,剩下不能组成m,那么t号硬币肯定必选(因为题目说了至少有一种组合超过x元)
{
b[++ans]=t;//记录编号t
}
}
printf("%d\n",ans);
for(int i=1;i<ans;i++)printf("%d ",a[b[i]]);
if(ans>0)printf("%d",a[b[ans]]);
printf("\n");
return 0;
}
本文介绍了一种解决特定硬币组合问题的算法实现。该问题要求从给定的硬币集合中选择硬币以达到指定的目标金额,并确定哪些硬币是必须被选择的。文章通过C++代码详细展示了如何计算在所有可能的组合中,哪些硬币会被重复使用。
1632

被折叠的 条评论
为什么被折叠?



