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!
题意:求n个数中部分之和能否为m; 思路:加a[i]或者不加,把所有的情况都给暴力出来(在暴力的过程中相等即终止),dfs深搜解决解决这种递归调用且倾于深度解; ps:可以增加剪枝条件(不难的);#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[1010]; int n,m; bool dfs(int i,int sum) { if(i==n) return sum==m; if(dfs(i+1,sum+a[i])) return true;//加 if(dfs(i+1,sum)) return true;//不加 return false; } int main() { while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&m); if(dfs(0,0)) printf("Of course,I can!\n"); else printf("Sorry,I can't!\n"); } return 0; }
换种剪枝:
-
There are multiple test cases.
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define max_n 30
int a[max_n];
int n,k;
bool flag=false;
void dfs(int x,int sum)
{
if(sum==k)
{
flag=true;
return;
}
if(sum>k) return;
if(x>=n) return;
dfs(x+1,sum+a[x+1]);
dfs(x+1,sum);
return;
}
int main()
{
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
flag=false;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&k);
sort(a+1,a+n+1);
dfs(0,0);
if(flag) printf("Of course,I can!\n");
else printf("Sorry,I can't!\n");
}
return 0;
}