1. 程式人生 > >1175.開心的金明 01揹包

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;
}

  

---恢復內容結束---