首页 > 代码库 > poj 1717 Dominoes 01背包
poj 1717 Dominoes 01背包
题意:
给两列数,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; }
poj 1717 Dominoes 01背包
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。