ACM题目————The partial sum problem
- 描述
- 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个数, 再给一个sum,能不能用这n个数,加起来等于sum!
主要难点在减少循环。
//时间超限代码:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556//Asimple
#include <stdio.h>
#include <iostream>
#include <string.h>
using
namespace
std;
#define CLS(a) memset(a,0,sizeof (a))
const
int
maxn = 25;
int
n, T, num, cnt, point, line, x, y;
int
vis[maxn];
//标记数组,标记是否走过
int
a[maxn];
bool
flag;
bool
check()
{
for
(
int
i=0; i<n; i++)
if
( !vis[i] )
return
false
;
return
true
;
}
void
DFS(
int
cnt)
{
if
( check() )
return
;
if
( cnt == num )
{
flag =
true
;
return
;
}
for
(
int
i=0; i<n; i++)
{
if
( !vis[i] && cnt + a[i] <= num )
{
vis[i] = 1 ;
DFS(cnt + a[i] ) ;
vis[i] = 0 ;
}
}
}
int
main()
{
while
( cin >> n )
{
cnt = 0 ;
CLS(vis);
flag =
false
;
for
(
int
i=0; i<n; i++)
cin >> a[i] ;
cin >> num ;
DFS(cnt);
if
( flag ) cout <<
"Of course,I can!"
<< endl ;
else
cout <<
"Sorry,I can't!"
<< endl ;
}
return
0;
}
减少循环后的代码:
12345678910111213141516171819202122232425262728293031323334353637383940//Asimple
#include <iostream>
using
namespace
std;
const
int
maxn = 25;
int
n, num, cnt;
int
a[maxn];
bool
flag;
void
DFS(
int
x)
{
if
( cnt > num )
return
;
if
( cnt == num )
{
flag =
true
;
return
;
}
for
(
int
i=x; i<n; i++)
{
cnt += a[i] ;
DFS(i+1);
cnt -= a[i] ;
}
}
int
main()
{
while
( cin >> n )
{
cnt = 0 ;
flag =
false
;
for
(
int
i=0; i<n; i++)
cin >> a[i] ;
cin >> num ;
DFS(0);
if
( flag ) cout <<
"Of course,I can!"
<< endl ;
else
cout <<
"Sorry,I can't!"
<< endl ;
}
return
0;
}
低调做人,高调做事。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理