子集和问题 - 回溯&搜索
题目地址: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 大家好,我是被算法题虐到泪流满面的老三,只能靠发发文章给自己打气! 这一节,我们来看看回 ...
随机推荐
- Windows10、ARM开发板、VMware虚拟机同时连接Internet
前段时间有人遇到一些网络连接问题,让我帮忙处理,他想让ARM开发板连接外网,可以连接网络数据库,同时保证自己的电脑可以上网. 本来说直接可以连接一个路由器,分配一个内网IP给ARM就可以了,但是当时那 ...
- SQL Server 运行计划操作符具体解释(1)——断言(Assert)
前言: 非常多非常多地方对于语句的优化,一般比較靠谱的回复即使--把运行计划发出来看看.当然那些仅仅看语句就说怎样怎样改代码,我一直都是拒绝的,由于这样的算是纯蒙.依据本人经验,大量的性能问题单纯从语 ...
- sql compare options
sql compare project's options Add object existence checks Use DROP and CREATE instead of ALTER Ignor ...
- YTU 2898: C-Z型变换
2898: C-Z型变换 时间限制: 1 Sec 内存限制: 128 MB 提交: 53 解决: 15 题目描述 让我们来玩个Z型变换的游戏,游戏的规则如下: 给你一个字符串,将它以Z字型的形状不 ...
- 如何装载Storyboard中的ViewController?
如上图所示,如何装载Storyboard中指定的ViewController? 首先,需要指定ViewController的ID,如上图右上方红色方框内的Storyboard ID.然后使用下面的 ...
- BZOJ_2424_[HAOI2010]订货_最小费用最大流
BZOJ_2424_[HAOI2010]订货_最小费用最大流 Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付 ...
- 【149】ArcGIS Desktop 10.0 & Engine 10.0 安装及破解
写在前面:可能会出现按照此方法无法破解的情况,那请确保您有将 ArcGIS 10.0 已经完全卸载干净,直接通过控制面板进行卸载的时候并不能将其卸载干净,需要进行更深层次的卸载,包括删除注册表,各种文 ...
- 最短路径(Dijkstra算法)
当用图结构来表示通信.交通等网络,权重代表距离或者成本,寻找最短路径就成为了一个重要的任务. 给定带权网络G=(V;E),源点s,对于其他所有顶点v,寻找s到v的最短路径,连接成一颗最短路径树.可以证 ...
- bzoj 1726: [Usaco2006 Nov]Roadblocks第二短路【dijskstra】
严格次短路模板,用两个数组分别维护最短路和次短路,用dijskstra,每次更新的时候先更新最短路再更新次短路 写了spfa版的不知道为啥不对-- #include<iostream> # ...
- weiphp插件开发注意
插件命名要规范,插件名文件名,控制器名,模型名要以大写开头.不然的话会有惊喜!╮(╯▽╰)╭