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