CJOJ 2022 【一本通】简单的背包问题
2017-07-02 13:55
183 查看
CJOJ 2022 【一本通】简单的背包问题(搜索)
Description
设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,…wn。 问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S。如果有满足条件的选择,则此背包有解,并输出解。(若有多组解,输出最先找到的一组解即可)
Input
第一行物品重量为s,物品的件数n第二行每件物品的重量(输入数据均为正整数)
Output
输出物品的序号和重量Sample Input
5 101 2 3 4 5
Sample Output
number:1 wieght:1number:4 wieght:4
number:5 wieght:5
Http
CJOJ:http://oj.changjun.com.cn/problem/detail/pid/2022Source
递归,搜索解决思路
简单的dfs,每次判断某个物品选或不选,注意输出顺序不要看到背包问题就想到动归
代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int maxN=5000; const int inf=2147483647; int n,S; int Weight[maxN]; vector<int> Arr; void dfs(int x,int sum); int main() { Arr.clear(); cin>>n>>S; for (int i=1;i<=n;i++) cin>>Weight[i]; dfs(n,0); cout<<"not found"<<endl; return 0; } void dfs(int x,int sum) { /*cout<<x<<' '<<sum<<endl; for (int i=0;i<Arr.size();i++) cout<<Arr[i]<<' '; cout<<endl<<endl; */ if (x==0) return; if (Weight[x]+sum<=S) { Arr.push_back(x); if (Weight[x]+sum==S) { for (int i=Arr.size()-1;i>=0;i--) printf("number:%d weight:%d\n",Arr[i],Weight[Arr[i]]); exit(0); } dfs(x-1,Weight[x]+sum); Arr.pop_back(); } dfs(x-1,sum); return; }
相关文章推荐
- CJOJ 2022 【一本通】简单的背包问题(搜索)
- [转载]简单背包问题的递归算法和非递归算法
- 简单背包问题
- 简单DP之二维背包问题
- 简单背包问题的递归与非递归实现
- 面试题34:简单背包问题
- 简单背包问题(实际上是子集问题)
- 贪心 简单背包问题
- HDU 2546 饭卡 简单背包问题
- Bone Collector (简单的0-1背包问题) HDU
- 简单的0-1背包问题
- 一个简单的背包问题
- 简单的背包问题
- 简单的背包问题--java递归实现
- 简单DP之最少硬币问题(多重背包问…
- 简单背包(无价值总和)问题的实现。
- 简单的背包问题
- 简单的背包问题(非递归和递归)
- HDU 1203——简单的背包问题
- 简单背包问题