DFS-The partial sum problem

本文讨论了如何高效地解决数组中寻找特定和的问题,包括了一个基本的深度优先搜索算法及其改进版本,旨在最小化运行时间。

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,我花了884MS。。。


我的AC代码

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int a[22], book[22], N, K;
bool dfs(int step, int sum) {
	if (step == N) return sum == K;
	if (dfs(step+1, sum)) return true;
	if (dfs(step+1, sum+a[step])) return true;
	return false;
}
int main() {
	//freopen("in.txt", "r", stdin);
	while(~scanf("%d", &N)) {
		for (int i = 0; i < N; i++) scanf("%d", &a[i]);
		scanf("%d", &K);
		memset(book, 0, sizeof(book));
		if (dfs(0, 0)) puts("Of course,I can!");
		else puts("Sorry,I can't!");
	}
	
	return 0;
}

大神剪枝代码:


#include <iostream>
#include <algorithm>
using namespace std;

bool Handle();

int src[100],n,k;
int Max[100];
int Min[100];
bool Ok;
char* result[]= {"Sorry,I can't!","Of course,I can!"};
int main(){
while(Handle()){
//empty while
}
}

void DFS(int Step, int Sum);
void InitAry();
bool Handle(){
if(!(cin>>n)){
return false;
}
for(int i= 0; i< n; ++i){
cin>>src[i];
}
cin>>k;
Ok=false;
sort(src,src+n);
InitAry();
DFS(n-1,0);
cout<<result[Ok]<<endl;
return true;
}

void DFS(int Step, int Sum){
if(Ok){//we have found one
return;
}
if(Step==-1){
if(Sum==k){
Ok= true;
}
return;
}
if(Sum+Max[Step]< k){
return;
}
if(Sum+Min[Step]> k){
return;
}
DFS(Step-1,Sum);
DFS(Step-1,Sum+src[Step]);
}

void InitAry(){
Max[0]= max(0,src[0]);
Min[0]= min(0,src[0]);
for(int i= 1; i< n; ++i){
Max[i]= max(Max[i-1],Max[i-1]+src[i]);
Min[i]= min(Min[i-1],Min[i-1]+src[i]);
}
}        

<think>我们正在处理用户关于HTML注释和部分视图的问题。根据引用[1]和[2],用户提供了关于Html.Partial和Html.RenderPartial的区别以及HTML注释标记的信息。此外,用户还提供了关于一个自定义模板的引用[3]和一个关于爱心动画的引用[4],但这些似乎与当前问题关系不大。 用户当前的问题是:`我想了解 <!-- partial:index.partial.html --> 代码的含义` 根据引用[1]和[2],我们可以知道: 1. HTML注释标记:`<!-- ... -->` 用于在HTML代码中添加注释,这些注释不会显示在浏览器中。 2. 在引用[1]中提到了`Html.Partial`和`Html.RenderPartial`,它们是服务器端渲染部分视图的方法,但在客户端HTML中,我们通常不会看到这样的标记。 然而,用户提到的`<!-- partial:index.partial.html -->`看起来像是一个注释,但它并不是标准的HTML注释用于说明,而是可能被某些模板引擎或静态网站生成器用作特殊指令。 在引用[3]中,用户提到了Hugo主题(hugo-theme-stack)中创建的自定义模板,并提到了一些HTML文件。Hugo是一个静态网站生成器,它使用Go模板。在Hugo中,我们可以使用部分模板(partial templates),这些模板通常存储在`layouts/partials`目录下。 在Hugo中,引入部分模板的语法是: ```go {{ partial "header.html" . }} ``` 但是,用户提供的示例是:`<!-- partial:index.partial.html -->`,这看起来像是一个注释,而不是Hugo的模板语法。然而,它可能是某种构建工具(如gulp、grunt)或静态网站生成器(如Hugo)的特定注释,用于指示在构建过程中将部分模板(partial)插入到该位置。 具体来说,一些构建工具允许你在HTML文件中放置特殊注释来包含其他文件。例如,使用gulp-inject插件,你可以在HTML中写: ```html <!-- inject:partial:filename.html --> <!-- endinject --> ``` 因此,`<!-- partial:index.partial.html -->`可能是类似这样的指令,表示在构建过程中,工具会将`index.partial.html`文件的内容插入到该位置。这样,在开发时,你可以将页面拆分成多个部分,然后通过构建工具将它们组合起来。 总结: `<!-- partial:index.partial.html -->` 是一条特殊注释,通常用于构建工具或静态网站生成器(如Hugo)中,指示在该位置插入名为`index.partial.html`的部分模板(partial template)的内容。在最终构建生成的HTML文件中,这个注释会被替换为实际的部分模板内容。 注意:这个语法不是标准HTML的一部分,而是特定工具的自定义语法。 基于以上分析,我们回答用户的问题。 </think>`<!-- partial:index.partial.html -->` 是**构建工具或模板引擎的特殊指令**,用于在编译/渲染过程中动态插入外部 HTML 片段。其核心含义和作用如下: ### 1. **功能解析** - **占位符作用**:该注释标记会被构建工具识别,表示此处需要插入外部文件 `index.partial.html` 的内容。 - **编译时替换**:在最终生成的 HTML 中,该注释会被替换为 `index.partial.html` 文件的实际内容(如图)。 - **模块化开发**:允许将大型 HTML 拆分成多个可复用组件(如页头、页脚),便于协作和维护[^1][^3]。 ```html <!-- 编译前 --> <body> <!-- partial:header.partial.html --> <!-- partial:index.partial.html --> <!-- partial:footer.partial.html --> </body> <!-- 编译后 --> <body> <header>...</header> <!-- 来自header.partial.html --> <main>...</main> <!-- 来自index.partial.html --> <footer>...</footer> <!-- 来自footer.partial.html --> </body> ``` ### 2. **典型使用场景** - **静态站点生成器**(如 Hugo): 在模板文件(如 `daily_info.html`)中引入部分视图,实现布局复用[^3]。 - **前端构建工具**(如 Gulp/Webpack): 通过插件(如 `gulp-inject`)自动合并 HTML 片段。 - **服务端渲染**: 类似 ASP.NET MVC 的 `@Html.Partial("_View")` 机制,但此语法更通用[^1]。 ### 3. **与普通注释的区别** | **特性** | `<!-- partial:x.html -->` | 普通 `<!-- ... -->` | |------------------|--------------------------------|----------------------------| | 是否显示在浏览器 | ❌(编译后消失) | ❌(始终隐藏) | | 是否触发工具操作 | ✅(触发文件插入) | ❌(仅注释用途) | | 典型用途 | 模块化开发、动态内容拼接 | 代码说明、临时禁用代码[^2] | ### 4. **为什么用这种语法?** - **兼容性**:以注释形式编写,确保未处理的原始文件仍能在浏览器中正常显示(不破坏布局)。 - **工具无侵入**:构建工具通过正则匹配识别指令,无需修改 HTML 标准[^4]。 > ⚠️ **注意**:该语法本身不属 HTML 规范,效果完全依赖构建工具(如 Hugo/Gulp)的支持。需检查项目配置是否启用了部分视图(partials)功能[^1][^3]。 --- ### 相关问题 1. 如何在 Hugo 中正确创建和使用部分视图(partials)? 2. 有哪些工具可以实现 HTML 文件的模块化拆分与合并? 3. 服务端渲染(如 ASP.NET)和静态站点生成器(如 Hugo)处理部分视图有何异同? 4. 如何在前端构建流程(Webpack/Gulp)中自动注入 HTML 片段? [^1]: 引用关于 `Html.Partial` 与模块化视图的描述。 [^2]: 引用关于 HTML 注释标记的标准用途。 [^3]: 引用 Hugo 模板中自定义部分视图的实践。 [^4]: 引用构建工具动态生成内容的实现逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值