1. 程式人生 > >Vijos P1133 裝箱問題(動態規劃,01揹包,NOIP)

Vijos P1133 裝箱問題(動態規劃,01揹包,NOIP)

noip2001普及組第四題

樣例分析

輸入容積24,6件物品 因為容量最多可達20000,為節省空間,只用一維陣列,用f[j]表示在容積為j時所裝物品所佔用的最大體積 對每一件物品,有放或不放兩種策略,不放,則體積仍為之前的f[j];放,則須留有足夠的空間,並佔用一定的體積,即f[j-v]+v 為了保證每件物品只取一次,所以用倒序迴圈,保證裝過的物品不會重複裝入 題目要求的是剩餘空間,即用最大容量c-f[c]

程式碼

#include <iostream>
using namespace std;
int c,n,v,f[20002];
int main()
{
	cin>>c>>n;
	for(int i=1;i<=n;i++)
	{
	  cin>>v;
	  for(int j=c;j>=v;j--)
	    f[j]=max(f[j],f[j-v]+v);
	}
	cout<<c-f[c]<<endl;
	return 0;
}