POJ 1775 dfs或dp
2013-03-15 17:28
239 查看
这一题要注意两点1、0!=1
2、最后是一个负数,并不一定是-1
可以使用dfs来做也可以当做背包来做。
dp程序,01背包刚好装满的情况
2、最后是一个负数,并不一定是-1
可以使用dfs来做也可以当做背包来做。
//11352654 c00h00g 1775 Accepted 384K 500MS G++ 635B 2013-03-15 17:31:41 //不是很会写递归,参考别人的程序 #include<stdio.h> #include<string.h> int fib[10]={1,1,2,6,24,120,720,5040,40320,362880}; int n; int vis[10]; int dfs(int i,int data){ if(data==n) return 1; if(data>n) return 0; for(int j=i;j<10;j++){ if(!vis[j]){ vis[j]=1; if(dfs(j+1,data+fib[j])) return 1;// 一直返回到结束,这一句很关键 vis[j]=0; } } return 0; } int main(){ while(scanf("%d",&n)&&n>=0){ if(n==0) { printf("NO\n");continue;} memset(vis,0,sizeof(vis)); if(dfs(0,0)) printf("YES\n"); else printf("NO\n"); } return 0; }
dp程序,01背包刚好装满的情况
//11352748 c00h00g 1775 Accepted 4296K 110MS G++ 664B 2013-03-15 18:06:48 //dp解法,对应背包正好装满的情形 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define INF 0x7fffffff int fib[10]={1,1,2,6,24,120,720,5040,40320,362880}; int n; int dp[1000005]; int main(){ for(int i=1;i<1000005;i++) dp[i]=-INF; dp[0]=0; for(int i=0;i<10;i++)//每个物品 for(int V=1000004;V>=0;V--){ if(V-fib[i]>=0&&dp[V-fib[i]]!=-INF) dp[V]=max(dp[V],dp[V-fib[i]]+fib[i]); } while(scanf("%d",&n)&&n>=0){ if(n==0) { printf("NO\n");continue;} //恰好装满的情况 if(dp >0) printf("YES\n"); else printf("NO\n"); } return 0; }
相关文章推荐
- poj 3311 floyd+dfs或状态压缩dp 两种方法
- POJ 3172 Scales (dfs剪枝,dp超时)
- poj 1636 监狱布局 dfs + dp 或 传递闭包 + dp
- poj 1775 简单的递归 dfs 找规律
- [poj 1014]Dividing的DFS解法解读和DP解法
- POJ--1699 Best Sequence(DP+dfs)
- POJ 1321 棋盘问题(状态压缩DP | DFS)
- POJ-1088 滑雪 (dfs + 线性dp)
- poj 1088 滑雪 DP(dfs的记忆化搜索)
- POJ 1321 棋盘问题(DFS & 状压DP)
- POJ--1699 Best Sequence(DP+dfs)
- POJ 3249 Test for Job (dfs + dp)
- poj1143 DP+dfs+位运算- -
- poj1088(dfs||dp)
- poj 3140 Contestants Division(树形dp? dfs计数+枚举)
- POJ 1414 Life Line (DP &amp; DFS)
- 记忆化搜索 dp(dfs)-帮助Jimmy POJ--1661
- POJ-3590 The shuffle Problem 置换+DP | DFS
- POJ 1321 棋盘问题(暴力dfs or DP)
- poj 3252 数位dp(dfs写法) 二进制0出现比1多的数字个数