1175.開心的金明 01揹包
阿新 • • 發佈:2018-12-15
---恢復內容開始---
#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; }
---恢復內容結束---