int m,n,t; int v[30],vi[30][30]; //v记录目标, vi记录可用选择 int total,p[30],ni[30]; bool line[30];
bool check() { for (int i = 0; i < m; i++) if(p[i] < v[i]) returnfalse; //只要有一个不满足就不行 returntrue; }
void search(int k,int depth) { if(check() && depth < total) //递归的结束控制 { total = depth; t = 0; for (int i = 0; i < n; i++) if(line[i]) ni[t++] = i+1; //记录行号 return; } for (int i = k+1;i < n; i++) { for (int j = 0; j < m; j++) p[j]+=vi[i][j]; //再增加一排进行搜索 line[i] = true; search(i,depth+1); //对应的depth要加1. for (int j = 0; j < m; j++) p[j]-=vi[i][j]; //将p[j]复原 line[i] = false; } }
int main() { cin >> m; for (int i = 0; i < m; i++) cin >> v[i]; cin >> n; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) cin >> vi[i][j]; total = 100; memset(p,0,sizeof(p)); memset(line,false,sizeof(line)); for (int i = 0; i < n; i++) //i表示第i+1排 { for (int j = 0; j < m; j++) //j表示第j+1列 p[j]+=vi[i][j]; //p[j]表示有i+1排时,第j列的和。 line[i] = true; //将第i排标记为正在使用中 search(i,1); for (int j = 0; j < m; j++) p[j]-=vi[i][j]; //将p[j]复原 line[i] = false; } cout << total <<""; t = 0; for (int i = 0; i < total-1; i++) cout << ni[i] <<""; cout << ni[total-1] << endl; return0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架