HDU 1171 Big Event in HDU

/* 解题报告:价值与体积相等的多重背包题可用两种方法解决 法一:代码1;线性规划 法二:代码2;优先级队列 注:线性动规时间复杂度低 */ //代码一 #include <iostream> #include <cstring> using namespace std; struct Node { int vw; int k; }node[105]; int n, sum, tempsum; int dp[250005], used[250005]; int main() { int i, j; while(cin>>n && n>=0) { sum = 0; memset(dp, 0, sizeof(dp)); //输入 for(i=0; i<n; ++i) { cin>>node[i].vw>>node[i].k; sum += node[i].vw * node[i].k; } tempsum = sum/2; //线性动规解决 for(i=0; i<n; ++i) { memset(used, 0, sizeof(used)); for(j=node[i].vw; j<=tempsum; j++) { int temp = dp[j-node[i].vw] + node[i].vw; if(temp>dp[j] && used[j-node[i].vw]<node[i].k) { dp[j] = temp; used[j] = used[j-node[i].vw] + 1; } } } int nMax = 0; for(i=1; i<=tempsum; i++) { if(nMax<dp[i]) nMax = dp[i]; } if(nMax <= sum-nMax) cout<<sum-nMax<<" "<<nMax<<endl; else cout<<nMax<<" "<<sum-nMax<<endl; } return 0; } //代码二 #include <iostream> #include <cstring> #include <deque> using namespace std; //变量类型声明 struct Node { int vw; int k; }node[105]; struct que { int value; int index; que(int nValue = 0, int nIndex = 0) { value = nValue; index = nIndex; } }; deque<que> dque; int n, sum; int dp[250005]; //入队函数 void enqueue(int value, int index) { while(!dque.empty() && dque.back().value < value) dque.pop_back(); dque.push_back(que(value, index)); } int main() { int i, j; while(cin>>n && n>=0) { //初始化 sum = 0; memset(dp, 0, sizeof(dp)); //输入 for(i=0; i<n; ++i) { cin>>node[i].vw>>node[i].k; sum += node[i].vw * node[i].k; } int tempsum = sum / 2; //单调队列处理 for(i=0; i<n; ++i) { if(node[i].k > tempsum/node[i].vw) node[i].k = tempsum/node[i].vw; //枚举余数 for(int d=0; d<node[i].vw; ++d) { dque.clear(); for(j=0; j<=(tempsum-d)/node[i].vw; j++) { enqueue(dp[j*node[i].vw+d]-j*node[i].vw, j); while(!dque.empty() && dque.front().index<j-node[i].k) dque.pop_front(); dp[j*node[i].vw+d] = dque.front().value + j*node[i].vw; } } } cout<<sum-dp[tempsum]<<" "<<dp[tempsum]<<endl; } return 0; }

你可能感兴趣的:(struct)