題目鏈接
果然還是太菜了…解空間樹考慮得太粗了,超時代碼(shame)
#include<bits/stdc++.h>
using namespace std;
int m, n, k, p[35];
bool vis[35], flag = false;
void dfs(int now){
if(now >= k){
if(m == 0)
{
printf("Yes\n");
exit(0);
}
}
for(int i = 0; i < n; i++){
if(m < p[i])
break;
if(!vis[i]){
vis[i] = true;
m -= p[i];
dfs(now + 1);
m += p[i];
vis[i] =false;
}
}
}
int main()
{
memset(vis, false, sizeof(vis));
scanf("%d%d%d", &m, &n, &k);
int i, j;
for(i = 0, j = 0; i < n; i++){
scanf("%d", &p[j]);
if(p[j] <= m)
j++;
}
n = j;
sort(p, p + n);
dfs(0);
printf("No\n");
return 0;
}
參考別人的代碼後,AC代碼如下
#include<bits/stdc++.h>
using namespace std;
int m, n, k, p[35];
void dfs(int t, int sum, int num){
if(sum == m && num == k)
{
printf("Yes\n");
exit(0);
}
if(num > k || sum > m || t == n)
return ;
for(int i = 1; i <= 2; i++){
if( i & 1)
dfs(t + 1, sum + p[t], num+1);
else
dfs(t + 1, sum , num);
}
}
int main()
{
scanf("%d%d%d", &m, &n, &k);
for(int i = 0; i < n; i++)
scanf("%d", &p[i]);
dfs(0, 0, 0);
printf("No\n");
return 0;
}