The partial sum problem
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
One day,Tom’s girlfriend give him an array A which contains N integers and asked him:Can you choose some integers from the N integers and the sum of them is equal to K.
-
输入
-
There are multiple test cases.
Each test case contains three lines.The first line is an integer N(1≤N≤20),represents the array contains N integers. The second line contains N integers,the ith integer represents A[i](-10^8≤A[i]≤10^8).The third line contains an integer K(-10^8≤K≤10^8).
输出
- If Tom can choose some integers from the array and their them is K,printf ”Of course,I can!”; other printf ”Sorry,I can’t!”. 样例输入
-
4 1 2 4 7 13 4 1 2 4 7 15
样例输出
-
Of course,I can! Sorry,I can't!
直接dfs用时长,可以剪枝
剪枝代码:用时12ms
01.
#include<iostream>
02.
using
namespace
std;
03.
int
n,k,a[25];
04.
bool
dfs(
int
p,
int
sum)
05.
{
06.
if
(sum==k)
return
1;
07.
if
(p==n||sum>k)
return
0;
08.
if
(dfs(p+1,sum))
return
true
;
09.
else
return
dfs(p+1,sum+a[p]);
10.
}
11.
int
main()
12.
{
13.
while
(cin>>n)
14.
{
15.
for
(
int
i=0;i<n;i++)
16.
cin>>a[i];
17.
cin>>k;
18.
if
(dfs(0,0))
19.
cout<<
"Of course,I can!"
<<endl;
20.
else
21.
cout<<
"Sorry,I can't!"
<<endl;
22.
}
23.
return
0;
24.
}
普通dfs:用时860ms
01.
#include<iostream>
02.
using
namespace
std;
03.
int
n,k,a[25];
04.
bool
dfs(
int
p,
int
sum)
05.
{
06.
if
(p==n)
return
sum==k;
07.
if
(dfs(p+1,sum))
return
true
;
08.
if
(dfs(p+1,sum+a[p]))
return
true
;
09.
return
false
;
10.
}
11.
int
main()
12.
{
13.
while
(cin>>n)
14.
{
15.
for
(
int
i=0;i<n;i++)
16.
cin>>a[i];
17.
cin>>k;
18.
if
(dfs(0,0))
19.
cout<<
"Of course,I can!"
<<endl;
20.
else
21.
cout<<
"Sorry,I can't!"
<<endl;
22.
}
23.
return
0;
24.
}
-
There are multiple test cases.