USACO2014MarchSilver Mooo Moo

【分析】
我们遇到的困难是如何知道如何用最小的奶牛数去处理一个定量的声音量。
这就自然引入了01背包。
可惜我突然忘记了这是无限背包,所以for的顺序应该反过来的,调了一会儿才发现。

【代码】

#define M 100005
#include
#include
#include
using namespace std;
int b[25],mc[105],dp[M];
int n,B,mx,ans;
void chk(int &x,int y){if(x==-1||x>y)x=y;}
int main(){
    int i,j;
    scanf("%d %d",&n,&B);
    memset(dp,-1,sizeof(dp));
    for(i=1;i<=B;i++)scanf("%d",&b[i]);
    for(i=1;i<=n;i++)scanf("%d",&mc[i]);
    for(i=n;i>=1;i--){
        mc[i]-=max(0,mc[i-1]-1);
        mx=max(mc[i],mx);
    }dp[0]=0;
    for(i=1;i<=B;i++){
        for(j=0;j+b[i]<=mx;j++){
            if(dp[j]==-1)continue;
            int x=j+b[i];
            chk(dp[x],dp[j]+1);
        }
    }
    for(i=1;i<=n;i++)ans+=dp[mc[i]];
    printf("%d",ans);
    return 0;
}   

你可能感兴趣的:(usaco,dp)