我要与时间赛跑
查看原帖
我要与时间赛跑
672360
Ch35楼主2022/6/1 19:59

我说一下我做这道题的历史: 第一次代码如下:

#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;
}

请各位教我一下这类题如何剪枝来避免TLE,谢谢!

2022/6/1 19:59
加载中...