2 条题解

  • 0
    @ 2025-7-4 14:23:18
    #include<bits/stdc++.h>
    using namespace std;
    int v;
    int a[105];
    int g;
    int b[105][105];
    
    int c[105];//吃的各种维他命量 
    int w[105];//吃的什么 
    int cnt;//吃的种类数 
    
    int cnt2= 1e9;
    int w2[105];//存最好吃什么饲料
    bool check(){
    	for(int i=1;i<=v;i++){
    		if(c[i]<a[i]) return 0;
    	}
    	return 1;
    }
    void dfs(int t){
    	if(t==g+1){
    		if(check()){//检查是否符合奶牛维他命要求
    			if(cnt<cnt2){//better
    				cnt2=cnt;
    				for(int i=1;i<=cnt2;i++) w2[i]=w[i];//转移
    			}
    		}
    		return;
    	}
    	w[++cnt]=t;//记录吃了第 t 种饲料
    	for(int i=1;i<=v;i++){
    		c[i]+=b[t][i];//吃第 t 种饲料获得第 i 种维他命
    	}
    	
    	dfs(t+1);//吃
    	
    	cnt--;
    	for(int i=1;i<=v;i++){
    		c[i]-=b[t][i];//回溯 
    	}
    	
    	dfs(t+1);//不吃
    	
    	
    	
    	
    	return;
    }
    signed main(){
    	scanf("%d",&v);
    	for(int i=1;i<=v;i++){
    		scanf("%d",&a[i]);
    	}
    	scanf("%d",&g);
    	for(int i=1;i<=g;i++){
    		for(int j=1;j<=v;j++){
    			scanf("%d",&b[i][j]);
    		}
    	}
    	dfs(1);
    	
    	cout<<cnt2<<' ';
    	for(int i=1;i<=cnt2;i++) cout<<w2[i]<<' ';//输出
    	return 0;
    }
    
    • -1
      @ 2025-7-4 14:02:04

      #include<bits/stdc++.h> using

      namespace std; int

      v,need[30],g,a[20]

      [30],ans,minn=0x7fffffff,t[30];

      int count(int x){

      int out=0;

      while (x){

      out+=x&1;

      x>>=1; }

      return out;

      }

      int main(){

      int i,j,k;

      bool flag;

      cin>>v;

      for (i=0;i<v;++i){

      cin>>need[i];

      }

      cin>>g;

      for (i=1;i<=g;++i){

      for (j=0;j<v;++j){

      cin>>a[i][j];

      }

      }

      for (i=(1<<g)-1;i>=0;--i){

      if (count(i)<minn){

      memset(t,0,sizeof(t));

      for (j=0;j<g;++j){

      if ((1<<j)&i){

      for (k=0;k<v;++k){

      t[k]+=a[g-j][k];

      }

      }

      }

      flag=true;

      for (j=0;j<v;++j){

      if (t[j]<need[j]){

      flag=false;

      break;

      }

      }

      if (flag){

      minn=count(i);

      ans=i;

      }

      }

      }

      cout<<minn;

      for (i=g-1;i>=0;--i){

      if ((1<<i)&ans){

      cout<<" "<<g-i;

      }

      }

      return 0;

      did jy have dick?
      
      • 1

      信息

      ID
      290
      时间
      1000ms
      内存
      256MiB
      难度
      6
      标签
      (无)
      递交数
      192
      已通过
      65
      上传者