子集和问题 - 回溯&搜索
题目地址:http://www.51cpc.com/web/problem.php?id=4264
其实一看到这道题我就想到了01背包,但是卡死在了如何顺序输出;
个人人为回溯本身就会用到搜索,像是充分不必要条件的那种感觉。
试了下动规的方法,并不适用于此题,动规可以得到是否有解或求出其中一组解,但无法按输入顺序输出第一组解。
Summarize:
1. 注意特判所有元素加起来都小于C;
2. 递归内循环从0开始,由于vis不必担心重复;但题目要求顺序输出,故应从0开始;
附AC代码:
#include<iostream>
#include<cstring>
#define inf 1e9
typedef long long LL;
using namespace std; const int N = 7e3+;
LL n,c;
LL a[N], vis[N], can; void dfs(int i, LL sum)
{
if(can || i>=n) return; if(sum == c)
{
can=;
int i=;
while(!vis[i] && i<n) i++;
cout<<a[i];
for(i++; i<n; i++)
if(vis[i]) cout<<' '<<a[i];
cout<<endl;
return;
} for(int k=; k<n; k++) {
if(sum+a[k]<=c && !vis[k]) {
vis[k] = ;
dfs(k, sum+a[k]);
vis[k] = ;
}
}
} int main()
{
ios::sync_with_stdio(false); while(cin>>n>>c)
{
can=;
LL sum=;
for(int i=; i<n; i++) {
cin>>a[i], vis[i]=;
sum += a[i];
}
if(sum < c) {
cout<<"No Solution!"<<endl;
continue;
}
dfs(,);
if(!can) cout<<"No Solution!"<<endl;
}
}
这里也附上动规的代码,不能AC,但仍未一种想法。
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
const int MAX =
int dp[MAX][MAX];
int p[MAX];
int n,m;
stack<int> goods; int main() {
cin>>m>>n;
for (int i = ; i <= m; i++)
cin >> p[i];
for (int i = ; i <= m; i++) {
for (int j = ; j <= n; j++) {
dp[i][j] = (i == ? : dp[i - ][j]);
if (j >= p[i]) {
dp[i][j] = max(dp[i][j], dp[i - ][j - p[i]] + p[i]);
}
}
} for (int i = m; i > ; i--)
for(int j=;j<=n;j++){
if (dp[i][n] - p[i] == dp[i - ][j]) {
goods.push(p[i]);
n = j;
}
} cout<<goods.top();
goods.pop(); while(!goods.empty()) {
cout<<' '<<goods.top();
goods.pop();
}
cout<<endl;
return ;
}
子集和问题 - 回溯&搜索的更多相关文章
- 图的m着色问题 (回溯搜索)
图的m着色问题 [问题描述] 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的 ...
- UVa 167(八皇后)、POJ2258 The Settlers of Catan——记两个简单回溯搜索
UVa 167 题意:八行八列的棋盘每行每列都要有一个皇后,每个对角线上最多放一个皇后,让你放八个,使摆放位置上的数字加起来最大. 参考:https://blog.csdn.net/xiaoxiede ...
- POJ 1416 Shredding Company 回溯搜索 DFS
Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6173 Accepted: 3361 ...
- Leetcode 52 N-Queens II 回溯搜索
对于N-Queens的每种情况,回答出每种情况的N-Queens的排列数. l,r和c是每种类型的格子是否有棋子. l判断的是这样的对角线的格子 r判断的是这样的对 ...
- 洛谷1378 油滴扩展 dfs进行回溯搜索
题目链接:https://www.luogu.com.cn/problem/P1378 题目中给出矩形的长宽和一些点,可以在每个点放油滴,油滴会扩展,直到触碰到矩形的周边或者其他油滴的边缘,求出剩余面 ...
- Network Saboteur POJ 2531 回溯搜索
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12886 Accepted: 6187 Description A un ...
- 回溯法——n后问题
问题描述: 在n*n的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于在n*n格的棋盘上放置n个皇后,任何2个皇后不放在同一行 ...
- LeetCode入门指南 之 回溯思想
模板 result = {} void backtrack(选择列表, 路径) { if (满足结束条件) { result.add(路径) return } for 选择 in 选择列表 { 做选择 ...
- LeetCode通关:连刷十四题,回溯算法完全攻略
刷题路线:https://github.com/youngyangyang04/leetcode-master 大家好,我是被算法题虐到泪流满面的老三,只能靠发发文章给自己打气! 这一节,我们来看看回 ...
随机推荐
- ExecuteNonQuery()的用法
ExecuteNonQuery()的用法 下面我们将详细讲解如何在Page_Load()中对数据库的增加.删除.修改,最后我们再来总结一下ExecuteNonQuery(),ExecuteScalar ...
- 从service启动activity startActivity慢 的解决方案
Intent intent = new Intent(context, A.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Pendin ...
- easyui 生成tas方式
1.采用<a>标签形式 <div id="tabs" style="width:100%;"> <ul> <li id ...
- 1998 NOIP 拼数 string 和sort的新理解
题目:https://www.luogu.org/problemnew/show/P1012 今天真是长了见识.这道题做了十几分钟,用模拟愣是调不出来.直到我看了题解——(当场去世)…… 题的意思是n ...
- E20170602-ts
questionnaire n. 调查问卷; 调查表; アンケート不是英语 collection n. 征收; 收集,采集; 收藏品; 募捐; association n. 联想; 协会, ...
- PKUACM 2018 D chocolate【并查集+克鲁斯卡尔】
传送:http://poj.openjudge.cn/practice/C18D/ 依然是课件截图 #include<iostream> #include<cstdio> #i ...
- 洛谷2019 3月月赛 T4
T3做不来.. 直接滚去T4 orz 乍一看 T4是个DP 题干 复杂度??(N^4) 咋优化... 还带一只捆绑 捆绑啥的最烦人了 最后20pts 直接废了 T了 很烦 不过拿到80pts已经很开心 ...
- php 页面展示
php 页面展示 复杂逻辑. 段落注释
- 为 C# 代码生成 API 文档(自译)
原文地址:http://broadcast.oreilly.com/2010/09/build-html-documentation-for-y.html#comments Sandcastle 功能 ...
- Spring-security自定义过滤器
定义过滤器 public class TokenAuthenticationFilter extends AbstractPreAuthenticatedProcessingFilter { publ ...