子集和问题 - 回溯&搜索
题目地址: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 大家好,我是被算法题虐到泪流满面的老三,只能靠发发文章给自己打气! 这一节,我们来看看回 ...
随机推荐
- my.os.ClickThisWindow.ClickThisPoint.py
my.os.ClickThisWindow.ClickThisPoint.py
- 洛谷T51924 忘情
二分上界有多大开多大 二分上界有多大开多大 二分上界有多大开多大 重要的事情说三遍 又被bright神仙带着做题了 先无脑上wqs二分 我们可以把这个柿子画一下,区间的花费就变成((sigema(l~ ...
- 洛谷 P3960 [ NOIP 2017 ] 列队 —— 线段树
题目:https://www.luogu.org/problemnew/show/P3960 NOIP 题,不用很复杂的数据结构...但又参考了许多: 要求支持维护删除第 k 个和在末尾插入的数据结构 ...
- uva1563
https://vjudge.net/problem/UVA-1563 高斯消元解同余方程组 就是把原来的除法换成逆元,其他的都一样 #include<bits/stdc++.h> usi ...
- 技嘉,u盘安装win7,提示“找不到驱动器设备驱动程序”
错误图: 解决办法: 网上说什么换usb2.0,修复用命令启动芸芸,反正对我来说没发现有什么卵用 详细步骤: 点击进入详细步骤页面地址
- $割点割顶tarjan$
原题 #include <bits/stdc++.h> using namespace std; typedef long long LL; inline LL read () { LL ...
- 有关lower_bound()函数的使用
lower_bound()函数需要加载头文件#include<algorithm>,其基本用途是查找有序区间中第一个大于或等于某给定值的元素的位置,其中排序规则可以通过二元关系来表示. 函 ...
- ACM_闹钟人生(水题)
闹钟人生 Time Limit: 2000/1000ms (Java/Others) Problem Description: 已知一个时钟一开始指向0点,顺时针走了n个小时,求它最终所指向的数字(时 ...
- redis在linux环境下的安装与启动
定义 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted s ...
- focus、click、blur、display、float、border、absolute、relative、fixed
onfocus:获取焦点,点击时,按着不放 onclick:点击松开之后,未点击其他处 onblur:点击松开之后,又点击其他处 display:block,none,inline block:单独占 ...