voidbtrack(int n, int start, vector<int> ¤t){//回溯进程 if (n == 0) { for (int i = 0; i < current.size() ; i++) { if (current.size() > 1) {//限制条件 if (i > 0) cout << "+"; cout << current[i]; } } cout << endl; return; }
for (int i = start; i <= n; i++) { current.push_back(i); btrack(n - i, i, current);//回退 current.pop_back();//本步做完进行弹出 } }
#include<bits/stdc++.h> usingnamespace std; int ans[1000], v[1000], siliao[1000][1000], a[1000]; int vt, g, minn = 100000000;
boolisfull(int x){//判断是否满足要求 for (int i = 1; i <= vt; i++) { int sum = 0; for (int j = 1; j <= x; j++) sum += siliao[a[j]][i]; if (sum < v[i])//某一类不满足则false returnfalse; } returntrue; }
voidfind(int t, int s){//寻找匹配方案 if (t > g) { if (isfull(s)) {//满足条件 if (s < minn) { minn = s;//置换答案 for (int i = 1; i <= minn; i++) { ans[i] = a[i];//同步替换 } } } return; } a[s + 1] = t;//进行标记 find(t + 1, s + 1);//如果采用某种饲料 a[s + 1] = 0;//回溯 find(t + 1, s);//如果不采用某种饲料 }
intmain(){ cin >> vt; for (int i = 1; i <= vt; i++) cin >> v[i]; cin >> g; for (int i = 1; i <= g; i++) { for (int j = 1; j <= vt; j++) cin >> siliao[i][j]; } find(1, 0); cout << minn << ' '; for (int i = 1; i <= minn; i++) cout << ans[i] << ' '; return0; }