hdu1171 转化01背包,组合
题意就是给你一些有价值的物品,你要把它分成尽量相同的两份。
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int main() { int t; while(cin>>t) { if(t<0) break; int val[5000]; int a,m; int len=0; int sum=0; while(t--) { cin>>a>>m; for(int i=len;i<len+m;i++) val[i]=a; len+=m; sum+=a*m; } int cost[255555];//开始开的数组太小了,导致RE memset(cost,0,sizeof(cost)); for(int i=0;i<len;i++)//转化为简单01背包 for(int j=sum/2;j>=val[i];j--) { int tem=val[i]+cost[j-val[i]]; if(tem>cost[j]) cost[j]=tem; } cout<<sum-cost[sum/2]<<" "<<cost[sum/2]<<endl; } return 0; }