hdu——1171(01揹包)
阿新 • • 發佈:2018-12-11
【分析】
把題目轉化為01揹包
兩個相近的的話
就是接近於總長的1/2
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<map> #include<cmath> using namespace std; #define maxn 1000010 int a[maxn],b[maxn]; int dp[maxn]; bool cmp(int a,int b) { return a>b; } int main() { int n; while(cin>>n&&n>0) { int sum=0; memset(dp,0,sizeof(dp)); memset(a,0,sizeof(a)); int cnt=0; while(n--) { int x,y; scanf("%d%d",&x,&y); sum+=x*y; while(y--) { a[cnt++]=x; } } sort(a,a+cnt,cmp); for(int i=0;i<cnt;i++) { for(int j=sum/2;j>=a[i];j--) { dp[j]=max(dp[j],dp[j-a[i]]+a[i]); } } printf("%d %d\n",sum-dp[sum/2],dp[sum/2]); } return 0; }