题意:
给两列数,a1,a2..an和b1,b2..bn,可以交换ak和bk,求让两列数和的差的绝对值最小的最少交换次数。
分析:
动态规划,dp[x]表示a1,..am进过交换达到和为x的最小交换次数。dp[x+a]<-dp[x],dp[x+b]<-dp[x]+1。
代码:
//poj 1717 //sep9 #include <iostream> using namespace std; const int maxM=12000; int dp[maxM+10]; int a,b; int main() { int i,j,n,sum=0; scanf("%d",&n); for(i=1;i<maxM;++i) dp[i]=200000; dp[0]=0; for(i=1;i<=n;++i){ scanf("%d%d",&a,&b); sum+=(a+b); for(j=sum;j>=0;--j) if(dp[j]<=n){ int tmp=dp[j]; dp[j]=200000; dp[j+a]=min(dp[j+a],tmp); dp[j+b]=min(dp[j+b],tmp+1); } } sum/=2; for(i=sum;i>=0;--i) if(dp[i]<=n) break; for(j=sum;j<maxM;++j) if(dp[j]<=n) break; printf("%d\n",min(dp[i],dp[j])); return 0; }
原文地址:http://blog.csdn.net/sepnine/article/details/43056801