一:题目 Come 宝宝!!
输出格式:
输出所有可行的方案数量
输入样例1:
3 50 50
10 40 40
结尾无空行
输出样例1:
4
结尾无空行
输入样例2:
3 50 50
20 40 40
结尾无空行
输出样例2:
0
二:思路
1.这个解的空间选择的是子集树
2.递归函数参数
backtacking()
把所有的可行解都记录下来
3.返回的结果
用一个vector<vector >ans:来存结果
vector path:用来存每次的集装箱所装的船的序号
将到达叶节点的时候集装箱(所装船的序号存进去)
3.递归终止条件
path.size() == n时候终止
这时候就是递归到达叶节点的时候 有了一种可行解
4.横向的单层的for循环为遍历所有集装箱的重量,纵向的递归是不断为剩下的集装箱选择船号
5.对结果的选择:具体看代码
6.示例举例
将集装箱1和2装上第一艘轮船,而将集装箱3装上第二艘轮船; 112
将集装箱1和2装上第二艘轮船,而将集装箱3装上第一艘轮船; 221
将集装箱1和3装上第一艘轮船,而将集装箱2装上第二艘轮船; 121
将集装箱1和3装上第二艘轮船,而将集装箱2装上第一艘轮船; 212
7:图示
三:上码
/**思路:1.这个解的空间选择的是子集树2.递归函数参数backtacking()把所有的可行解都记录下来 3.返回的结果用一个vector<vector<int> >ans:来存结果vector<int> path:用来存每次的集装箱所装的船的序号 将到达叶节点的时候集装箱(所装船的序号存进去) 3.递归终止条件path.size() == n时候终止这时候就是递归到达叶节点的时候 有了一种可行解4.横向的单层的for循环为遍历所有集装箱的重量,纵向的递归是不断为剩下的集装箱选择船号5.对结果的选择:具体看代码 6.示例举例将集装箱1和2装上第一艘轮船,而将集装箱3装上第二艘轮船; 112将集装箱1和2装上第二艘轮船,而将集装箱3装上第一艘轮船; 221将集装箱1和3装上第一艘轮船,而将集装箱2装上第二艘轮船; 121将集装箱1和3装上第二艘轮船,而将集装箱2装上第一艘轮船; 212**/
#include<bits/stdc++.h>
using namespace std;vector<vector<int> > ans;//用来存放每次的可行解
vector<int> path;//用来存放单次的可行解
int n,c1,c2;void backtacking(){//递归终止条件if (path.size() == n) {ans.push_back(path);return;} for (int i = 1; i <= 2; i++) {path.push_back(i);backtacking();path.pop_back(); }}
int main(){vector<int> v;int count = 0;cin >> n >> c1 >> c2;for (int i = 0; i < n; i++) {int num;cin >> num;v.push_back(num); }backtacking();for (int i = 0; i < ans.size(); i++) {int sumWeight1 = 0;//记录在船1上的累计重量 int sumWeight2 = 0;//记录在船2上的累计重量 for (int j = 0; j < n; j++) {if (ans[i][j] == 1){ sumWeight1 += v[j]; }else{sumWeight2 += v[j];} // cout << ans[i][j] << ' ';}// cout << endl;if(sumWeight1 <= c1 && sumWeight2 <= c2 && sumWeight1 != 0 && sumWeight2 != 0){//这里是比较装的重量和船的载重 count++;// cout << sumWeight1 << ' ' << sumWeight2; }}cout << count; }
加油 boy!!! 下雪了 哈哈哈 今年的第一场雪!!!