题意:给出n个物品的价值v,每个物品有m个,设总价值为sum,求a,b。a+b=sum,且a尽可能接近b,a>=b。
题解:01背包。
#include <bits/stdc++.h> using namespace std; int data[5050],dp[125050],n,v,m; int main() { while(scanf("%d",&n)&&n>0) { memset(dp,0,sizeof(dp)); int sum=0,cnt=0; for(int i=0;i<n;i++) { scanf("%d%d",&v,&m); sum+=v*m; while(m--) data[cnt++]=v; } int k=sum/2; for(int i=0;i<cnt;i++)//注意不是n for(int j=k;j>=data[i];j--) dp[j]=max(dp[j],dp[j-data[i]]+data[i]); printf("%d %d ",sum-dp[k],dp[k]); } return 0; }