HDU 1581 Square
来源:互联网 发布:前锦网络 编辑:程序博客网 时间:2024/05/17 05:12
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1518
在无数wrong answer 和tle 以后终于过了。
需要注意以下几点:
1、在寻找sum/4的组合的时候,当前满足条件的组合,不一定是最终的组合。
所以:
vis[i] = 1;//标记。dfs();vis[i]=0;//撤除标记,寻找是否有新的满足条件的组合。作为思路不清的菜鸟,我犯了这个毛病。
2、在寻找其中一个满足条件的组合的时候,我们可以有序的,从第一个没有别访问过的数开始,然后到了下一个DFS的时候挨个向后找。
而不是每个DFS都把所有的每访问过的数,枚举一遍,否则会超时。
代码应该是:
void dfs(int edge,int l,int k){int i;if(edge==5){flag=1;return;}else{for(i=k;i<n;i++){if(!vis[i] && l+a[i] <=sum){if(l+a[i]==sum){vis[i]=1;dfs(edge+1,0,0);if(flag)return;vis[i]=0;}else if(l+a[i]<sum){vis[i] = 1;dfs(edge,a[i]+l,i+1);if(flag)return;vis[i]=0;}}}}}
而不是:
void dfs(int edge,int l){int i;if(edge==5){flag=1;return;}else{for(i=0;i<n;i++){if(!vis[i] && l+a[i] <=sum){if(l+a[i]==sum){vis[i]=1;dfs(edge+1,0);if(flag)return;vis[i]=0;}else if(l+a[i]<sum){vis[i] = 1;dfs(edge,a[i]+l);if(flag)return;vis[i]=0;}}}}}以上就是我的错误,希望别的同学可以有则改之,无则加勉。
完整的AC代码如下:
#include<stdio.h>#include<string.h>int n,sum,l;int a[30],vis[30];int flag;void dfs(int edge,int l,int k){ int i; if(edge==5) { flag=1; return; } else { for(i=k;i<n;i++) { if(!vis[i] && l+a[i] <=sum) { if(l+a[i]==sum) { vis[i]=1; dfs(edge+1,0,0); if(flag) return; vis[i]=0; } else if(l+a[i]<sum) { vis[i] = 1; dfs(edge,a[i]+l,i+1); if(flag) return; vis[i]=0; } } } }}int main(){ int t,i; scanf("%d",&t); while(t--) { scanf("%d",&n); sum=0; int Max=0; for(i=0;i<n;i++) { scanf("%d",&a[i]); sum+=a[i]; if(Max<a[i]) Max=a[i]; } if(sum%4!=0) { printf("no\n"); continue; } sum=sum/4; if(sum<Max) { printf("no\n"); } flag=0; memset(vis,0,sizeof(vis)); dfs(1,0,0); if(flag) printf("yes\n"); else printf("no\n"); } return 0;}
0 0
- HDU 1581 Square
- Square HDU
- Square HDU
- Square HDU
- HDU Square
- hdu 1398Square Coins
- hdu 1398 Square Coins
- dfs hdu 1518 square
- hdu 1518 Square (DFS)
- hdu 1518 Square
- hdu 4394 Digital Square
- HDU 1518 Square
- Hdu 1398 - Square Coins
- Hdu 1518 - Square
- HDU 1518 - Square
- HDU 1518 Square
- HDU 1518 Square
- hdu 1398 Square Coins
- 与code review相关的一系列博文
- android MediaRecorder录制音频
- set的继承
- django1.6 使用userprofile 以及一些关于用户系统的总结
- 什么是firmware?
- HDU 1581 Square
- 云计算
- MessageFormat用法
- Oracle停止正在进行的job
- Type Syntax error, insert ")" to complete Expression
- 算法导论9 Random_Select
- ACM-对称博弈之Coin Game——hdu3951
- cocos2d-x安装配置步骤
- UISearchBar和UISearchDisplayController