我说一下我做这道题的历史: 第一次代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m,need[30],sl[30][30],l[30],c[30],minn=INT_MAX,ans[30],cnt;
void xx(){
for(int i=1;i<=n;i++){
if(l[i]<need[i])break;
if(i==n){
if(cnt<minn){
minn=cnt;
for(int i=1;i<=m;i++)ans[i]=c[i];
}
}
}
for(int i=1;i<=m;i++){
if(c[i]==0){
c[i]=1;
cnt++;
for(int j=1;j<=n;j++)l[j]+=sl[i][j];
xx();
c[i]=0;
cnt--;
for(int j=1;j<=n;j++)l[j]-=sl[i][j];
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>need[i];
cin>>m;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++)cin>>sl[i][j];
}
memset(l,0,sizeof(l));
memset(c,0,sizeof(c));
memset(ans,0,sizeof(ans));
xx();
cout<<minn;
for(int i=1;i<=m;i++){
if(ans[i]==1)cout<<' '<<i;
}
return 0;
}
第二次:
#include<bits/stdc++.h>
using namespace std;
int n,m,need[30],sl[30][30],l[30],c[30],minn=INT_MAX,ans[30],cnt;
bool jump=0;
void xx(){
if(jump==1)return;
for(int i=1;i<=n;i++){
if(l[i]<need[i])break;
if(i==n){
if(cnt<minn){
minn=cnt;
for(int i=1;i<=m;i++)ans[i]=c[i];
if(cnt==1){jump=1;return;}
}
}
}
for(int i=1;i<=m;i++){
if(c[i]==0){
c[i]=1;
cnt++;
for(int j=1;j<=n;j++)l[j]+=sl[i][j];
xx();
c[i]=0;
cnt--;
for(int j=1;j<=n;j++)l[j]-=sl[i][j];
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>need[i];
cin>>m;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++)cin>>sl[i][j];
}
memset(l,0,sizeof(l));
memset(c,0,sizeof(c));
memset(ans,0,sizeof(ans));
xx();
cout<<minn;
for(int i=1;i<=m;i++){
if(ans[i]==1)cout<<' '<<i;
}
return 0;
}
第三次:
#include<bits/stdc++.h>
using namespace std;
int n,m,need[30],sl[30][30],l[30],c[30],minn=INT_MAX,ans[30],cnt;
bool jump=0;
void xx(){
if(jump==1)return;
if(cnt>minn)return;
for(int i=1;i<=n;i++){
if(l[i]<need[i])break;
if(i==n){
if(cnt<minn){
minn=cnt;
for(int i=1;i<=m;i++)ans[i]=c[i];
if(cnt==1){jump=1;return;}
}
}
}
for(int i=1;i<=m;i++){
if(c[i]==0){
c[i]=1;
cnt++;
for(int j=1;j<=n;j++)l[j]+=sl[i][j];
xx();
c[i]=0;
cnt--;
for(int j=1;j<=n;j++)l[j]-=sl[i][j];
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>need[i];
cin>>m;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++)cin>>sl[i][j];
}
xx();
cout<<minn;
for(int i=1;i<=m;i++){
if(ans[i]==1)cout<<' '<<i;
}
return 0;
}