骨牌
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; } } }