之前的代码,超时一个
#include <iostream>
using namespace std;
const int N = 50;
int v[N], g[N][N], path[N], ans[N];
// path 在搜索过程中保存下来的选择
int n, p, minn = 1e9;
bool check(int s){
for(int i = 1; i <= n; ++ i){
int sum = 0;
for(int j = 1; j <= p; ++ j){
sum += g[path[j]][i];
}
if(sum < v[i]) return false;
}
return true;
}
void dfs(int x, int s){ // s是目前选了多少个
if(x > n){
if(check(s)){
// 更新最优解
if(s < minn){
minn = s;
for(int i = 1; i <= minn; ++ i)
ans[i] = path[i];
}
}
return ;
}
// 选
path[s + 1] = x;
dfs(x + 1, s + 1);
path[s + 1] = 0; // 回溯
// 不选
dfs(x + 1, s);
return ;
}
int main(){
cin >> n;
for(int i = 1; i <= n; ++ i) cin >> v[i];
cin >> p;
for(int i = 1; i <= p; ++ i)
for(int j = 1; j <= n; ++ j)
cin >> g[i][j];
dfs(1, 0);
cout << minn << " ";
for(int i = 1; i <= minn; ++ i)
cout << ans[i] << " ";
return 0;
}
想着优化一下,结果更离谱了
#include <iostream>
using namespace std;
const int N = 30;
int v[N], g[N][N], path[N], ans[N];
// path 在搜索过程中保存下来的选择
int n, p, minn = 1e9;
bool check(int s){
for(int i = 1; i <= n; ++ i){
int sum = 0;
for(int j = 1; j <= p; ++ j){
sum += g[path[j]][i];
}
if(sum < v[i]) return false;
}
return true;
}
void dfs(int x, int s){ // s是目前选了多少个
if(check(s)){
if(x > p){
// 更新最优解
if(s < minn){
minn = s;
for(int i = 1; i <= minn; ++ i)
ans[i] = path[i];
}
}
return ;
}
if(x > p) return ;
// 选
path[s + 1] = x;
dfs(x + 1, s + 1);
path[s + 1] = 0;
// 不选
dfs(x + 1, s);
}
int main(){
cin >> n;
for(int i = 1; i <= n; ++ i) cin >> v[i];
cin >> p;
for(int i = 1; i <= p; ++ i)
for(int j = 1; j <= n; ++ j)
cin >> g[i][j];
dfs(1, 0);
cout << minn << " ";
for(int i = 1; i <= minn; ++ i)
cout << ans[i] << " ";
return 0;
}