-
描述
-
给定整数a1、a2、.......an,判断是否可以从中选出若干数,使它们的和恰好为K。
-
输入
-
首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)
输出
- 如果和恰好可以为k,输出“YES”,并按输入顺序依次输出是由哪几个数的和组成,否则“NO” 样例输入
-
4 13 1 2 4 7
样例输出
-
YES 2 4 7
来源
- 经典题目
-
首先,n和k,n表示数的个数,k表示数的和。
#include<stdio.h>
#include<string.h>
using namespace std;
int n,book[1010],a[25],m,sz[25],flag=0;
void dfs(int sum,int i)
{
#include<string.h>
using namespace std;
int n,book[1010],a[25],m,sz[25],flag=0;
void dfs(int sum,int i)
{
if(sum>m)
return; //减少时间,防超时;
if(sum==m)
{
flag=1;
return ;
}
if(i==n+1)
{
return;
}
book[i]=1;
dfs(sum+sz[i],i+1); //加上sz【i】,标记为1;
if(flag)
return;
book[i]=0;
dfs(sum,i+1); //不加上sz【i】,标记为0;
return;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(sz,0,sizeof(sz));
memset(book,0,sizeof(book));
for(int j=1;j<=n;j++)
scanf("%d",&sz[j]);
dfs(0,1);
if(flag)
{
printf("YES\n");
for(int i=1;i<=n;i++)
{
if(book[i])
printf("%d ",sz[i]);
}
printf("\n");
}
else
printf("NO\n");
flag=0; //多组输入,把 flag初始化;
}
return; //减少时间,防超时;
if(sum==m)
{
flag=1;
return ;
}
if(i==n+1)
{
return;
}
book[i]=1;
dfs(sum+sz[i],i+1); //加上sz【i】,标记为1;
if(flag)
return;
book[i]=0;
dfs(sum,i+1); //不加上sz【i】,标记为0;
return;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(sz,0,sizeof(sz));
memset(book,0,sizeof(book));
for(int j=1;j<=n;j++)
scanf("%d",&sz[j]);
dfs(0,1);
if(flag)
{
printf("YES\n");
for(int i=1;i<=n;i++)
{
if(book[i])
printf("%d ",sz[i]);
}
printf("\n");
}
else
printf("NO\n");
flag=0; //多组输入,把 flag初始化;
}
return 0;
}
}
本文介绍了一种解决特定类型组合优化问题的方法——部分和问题。该问题的目标是从给定的一系列整数中找出某些数,使得这些数的总和等于预设的目标值K。文章通过递归深度优先搜索算法实现解决方案,并提供了完整的C++代码示例。
2665

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



