您的位置:首页 > 其它

1221. 数字游戏 (01背包)

2012-03-16 00:04 162 查看
/*状态转移方程则是:dp[j]=max(dp[j],dp[j-1]+a[i]-b[i]*(j-1))
理解为对于第i个数字,当要选取j个数字时,最优结果是:
不选取这个数字,从剩下的数字中再选取j个数字的最优结果;
或者是选取这个数字,从剩下的数字中再选取j-1个数字的最优结果。
以上两者的更优者就是最优解。如此进行下去,score[m]就是最终解。*/
#include<iostream>            //0-1背包 
#include<algorithm>
using namespace std;
struct node
{
    int a,b;
}ans[202];
bool cmp(const node& x,const node& y)
{
    return x.b>y.b;
}
int n,m,dp[202];
int main()
{
    cin>>n>>m;
    for(int i=0;i<n;++i)
        cin>>ans[i].a;
    for(int i=0;i<n;++i)
        cin>>ans[i].b;
    sort(ans,ans+n,cmp);
    for(int i=0;i<n;++i)    //bi 递减
        for(int j=m;j>0;--j)
            dp[j]=max(dp[j],dp[j-1]+ans[i].a-ans[i].b*(j-1));    //dp[j]表示 j 回合内能选中的ai最大总和
    cout<<dp[m]<<endl;
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: