USACO 2.1.4 健康的荷斯坦奶牛 Healthy Holsteins

题解

这道题我一直想着用dp来解,因为我觉得和01背包很像。
但是这个容量数据没办法用数组表示,所以一直想不到解法。
我默认dfs是会指数爆炸的不好解法,所以一开始就没考虑,但这题的数据很弱…


代码

#include <iostream>
#include <cstdio>
#include <fstream>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
int n,m;
int v[26],p[16][26];
int eat[16],ans[16];
int cur_s=0,min_s=30;

bool eatup(){// 吃够了?
    for(int k=1;k<=n;k++)
        if(v[k] > 0 ) return false;
    return true;
}

void dfs(int k){
    if( eatup() ){// 吃够了 判断 更新答案
        if( cur_s < min_s ){
            min_s = cur_s;
            int pos,i;
            pos = i = 1;
            while(pos<=m){
                if(eat[pos])
                    ans[i++] =pos;
                pos++;
            }
        }
        return;
    }

    if( k > m ) return;


    for(int i=1;i<=n;i++)// 吃 
        v[i]-=p[k][i];
    eat[k] = 1;
    cur_s++;
    dfs(k+1);

    eat[k] = 0; // 不吃
    for(int i=1;i<=n;i++)
        v[i]+=p[k][i];
    cur_s--;
    dfs(k+1);

}


int main(void){

    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>v[i];
    cin>>m;
    for(int i=1;i<=m;i++)
        for(int k=1;k<=n;k++)
            cin>>p[i][k];

    dfs(1);
    cout<<min_s<<" ";
    for(int i=1;i<=min_s;i++)
        cout<<ans[i]<<" ";
    cout<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/smmyy022/article/details/81451194