浮點數運算的誤差
阿新 • • 發佈:2020-09-19
狀態表示:\(f(i,j):\)從前\(i\)個物品中選,總體積不超過\(j\)的情況下的最大價值
狀態轉移:
- 選第\(i\)個物品:\(f(i,j)=f(i-1,j-v_i)+w_i\)
- 不選第\(i\)個物品:\(f(i,j)=f(i-1,j)\)
const int N=1010; int f[N][N]; int n,m; int main() { cin>>n>>m; for(int i=1;i<=n;i++) { int v,w; cin>>v>>w; for(int j=0;j<=m;j++) if(j<v) f[i][j]=f[i-1][j]; else f[i][j]=max(f[i-1][j],f[i-1][j-v]+w); } cout<<f[n][m]<<endl; //system("pause"); }
第\(i\)層狀態只與第\(i-1\)層狀態有關,採用滾動陣列優化
const int N=1010; int f[2][N]; int n,m; int main() { cin>>n>>m; for(int i=1;i<=n;i++) { int v,w; cin>>v>>w; for(int j=0;j<=m;j++) if(j<v) f[i&1][j]=f[i-1&1][j]; else f[i&1][j]=max(f[i-1&1][j],f[i-1&1][j-v]+w); } cout<<f[n&1][m]<<endl; //system("pause"); }
可繼續優化至一維:
const int N=1010; int f[N]; int n,m; int main() { cin>>n>>m; for(int i=1;i<=n;i++) { int v,w; cin>>v>>w; for(int j=m;j>=v;j--) f[j]=max(f[j],f[j-v]+w); } cout<<f[m]<<endl; //system("pause"); }