Problem S

简单题意

杭电要分家,家当要尽量平均分,保证A>=B,给出,每种价值的家当的价值,及其数量,求出平分家当的结果。

解题思路形成过程

题目中有个提示,You can assume that all V are different,把每个家当都当成不同的(忽略价值一样),这样用一个数组,把每个价值分出来,之后就是dp了,dp数组保存的是当前状态最优的分配方法。

AC代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<fstream>
using namespace std;
int val[5005];
int dp[255555];
int main(){
    ifstream cin("in.txt");
    freopen("in.txt","r",stdin);
    int n;
    int v,m;
    while(cin>>n){
        if(n<0)continue;
        int l=0,sum=0;
        for(int i=0;i<n;i++){
            cin>>v>>m;
            while(m--){
                val[l++]=v;
                sum+=v;
            }
        }
        memset(dp,0,sizeof(dp));
        for(int i=0;i<l;i++){
            for(int j=sum/2;j>=val[i];j--){
                dp[j]=max(dp[j],dp[j-val[i]]+val[i]);
            }
        }
        cout<<sum-dp[sum/2]<<" "<<dp[sum/2]<<endl;
    }
    return 0;
}

你可能感兴趣的:(dp)