1175.开心的金明 01背包

---恢复内容开始---

#include<bits/stdc++.h>
using namespace std;
int a[30050],b[30050];
int mp[30050];
int n,i,tmp,m,j;
int main()
{
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        memset(mp,0,sizeof(mp));
        for(i=1;i<=m;i++)
        {
            scanf("%d %d",&a[i],&b[i]);
        }
        //m[i][j] 表示在面对第i件物品,且背包容量为 j时所能获得的最大价值 
//        //时间复杂度O(N * M),空间复杂度也为O(N * M)
//        for(i=1;i<=m;i++)//物品
//        {
//            for(j=0;j<=n;j++)//资源
//            {
//                if(j>=a[i])mp[i][j]=max(mp[i-1][j],mp[i-1][j-a[i]]+a[i]*b[i]);
//                else mp[i][j]=mp[i-1][j];
//            }
//                
//        }
        //空间复杂度也为O(N)
        for(i=1;i<=m;i++)//物品
        {
            for(j=n;j>=0;j--)//钱数
            {//利用滚动数组求背包问题最合适的值
                if(j-a[i]>=0) mp[j]=max(mp[j],mp[j-a[i]]+a[i]*b[i]);
            }
        }
        cout<<mp[n]<<endl;
    }
    return 0;
}

  

---恢复内容结束---

posted @ 2018-12-15 20:03  观稳769  阅读(111)  评论(0编辑  收藏  举报