利用01背包的思想,对于每件物品取或不取,然后进行深搜即可。此题是借鉴别人的代码,自己也不是特别懂深搜,希望和大家一块儿学习。
代码如下:
01.
#include<stdio.h>
02.
#include<string.h>
03.
#include<algorithm>
04.
using
namespace
std;
05.
int
a[23],n,sum;
06.
int
dfs(
int
k,
int
s)
07.
{
08.
if
(s==sum)
09.
return
1;
10.
if
(k==n||(s>sum&&s>0)||(a[k]>sum&&sum>0))
//此处进行剪枝
11.
return
0;
12.
if
(dfs(k+1,s+a[k])||dfs(k+1,s))
//利用01背包的思想,对于一件物品来说要么选,要么不选
13.
return
1;
14.
return
0;
15.
}
16.
int
main()
17.
{
18.
while
(
scanf
(
"%d"
,&n)!=EOF)
19.
{
20.
for
(
int
i=0;i<n;i++)
21.
scanf
(
"%d"
,&a[i]);
22.
scanf
(
"%d"
,&sum);
23.
if
(dfs(0,0))
24.
printf
(
"Of course,I can!\n"
);
25.
else
26.
printf
(
"Sorry,I can't!\n"
);
27.
28.
}
29.
}