骨牌

DP,em.......,代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int a[1100],b[1100];
int dp[1100][12005];
int n;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i]>>b[i];
    }
    memset(dp,0x7f,sizeof(dp));
    dp[0][6000]=0;//dp[0][6000]一定为零 
    for(int i=1;i<=n;i++)//一定要<=n 
    {
        for(int j=0;j<=12000;j++)
        {
            int ans=a[i]-b[i];//算差值 
            dp[i][j]=min(dp[i-1][j-ans],dp[i-1][j+ans]+1);//dp[i-1][j-ans],i-1为上一次的状态,j-ans为j-差值,下一个意思相反 
        }
    }
    int ans=0;
    for(int i=0;i<=6000;i++)
    {
        ans=min(dp[n][i+6000],dp[n][6000-i]);//-i+6000防止有复数 
        if(ans<=1000)//最多有1000个骨牌.... 
        {
            cout<<ans<<endl;
            return 0;
        }
    }
}

 

posted @ 2018-08-08 15:49  DJY_01  阅读(130)  评论(0编辑  收藏  举报