社区讨论
为啥都用动态规划?
P1164小 A 点菜参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lqg25eim
- 此快照首次捕获于
- 2023/12/22 11:14 2 年前
- 此快照最后确认于
- 2023/12/22 17:02 2 年前
这个问题有必要动态规划吗?直接组合数就好了呀!比如这个店有10种菜,其中3种2块,3种3块,4种5块,一共15块,可以是53,或者是52+3+2,或者52+32+22,或者33+2*3
总数量为C(4,3)+C(4,2)*C(3,1)*C(3,1)+ C(4,2)*C(3,2)*C(3,2)+C(3,3)*C(3,3)
CPP'''
#include<cstdio>
using namespace std;
long long ans=0;
long long c(long long n,long long m)
{
long long i,x=1;
for(i=n;i>m;i--)
{
x*=i;
x/=n+1-i;
}
return x;
}
void fun(long long *a,long long *b,long long m,long long k)
{
long long i,j,x=1;
if(k>1000)
return;
if(m==0)
{
for(i=0;i<=1000;i++)
if(a[i])
x*=c(a[i],b[i]);
ans+=x;
return;
}
for(j=k+1;j<=1000 && a[j]==0;j++);
for(i=0;i<=a[j];i++)
{
if(m>=i*j)
{
if(j<=1000)
{
b[j]=i;
fun(a,b,m-i*j,j);
b[j]=0;
}
}
else
break;
}
}
int main()
{
long long n,m,i,a[1001],b[1001],x;
scanf("%lld%lld",&n,&m);
for(i=0;i<=1000;i++)
{
a[i]=0;
b[i]=0;
}
for(i=0;i<n;i++)
{
scanf("%d",&x);
a[x]++;
}
fun(a,b,m,-1);
printf("%lld",ans);
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...