题目:nefu:林大超市买水果-搜索
原以为C(30,8)太大,会超时,就一直用dp做,结果循环大,又计算了一下C(30,8)不到6e6,所以并不会超时。
基本思想:不降原则。
#include <bits/stdc++.h>
using namespace std;
int a[35];
int vis[35];
int sum=0;
int ok=0;
void work(int x,int m,int n,int k,int now)
// x为已经选择了多少个 //now为已经选到的最大标记
{
if(ok)
return ;
if(x==k)
{
if(sum==m)
{
ok=1;
}
return ;
}
else
{
for(int i=now+1;i<=n-(k-x-1);i++)
// 循环的最大可以写n,只要不超时。
{
if(!vis[i])
{
sum+=a[i];
vis[i]=1;
work(x+1,m,n,k,i);
if(ok)
return ;
vis[i]=0;
sum-=a[i];
}
}
}
}
int main()
{
int m,n,k;
scanf("%d%d%d",&m,&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
work(0,m,n,k,0);
if(ok)
printf("Yes\n");
else
printf("No\n");
return 0;
}