USACO3.1 Stamps(stamps)

        動態規劃題,隱式二維費用揹包,設s[i]表示輸入的郵票面值,d[k]表示貼出k郵資所須要的郵票的最少張數。因而動態轉移方程:d[j+s[i]]=min{d[j+s[i]],d[j]+1}。對j:0~mm*m,i:0~n-1,求每一對組合(j,i)決定的d[j+s[i]]的最小值,最後d[k]的值就是貼出k郵資所需郵票數量的最小值。注意初始化,除了d[0]=0,其餘都初始化爲10000。ios

/*
ID:jzzlee1
PROB:stamps
LANG:C++
*/
//#include<iostream>
#include<fstream>
using namespace std;
ifstream cin("stamps.in");
ofstream cout("stamps.out");
short d[2010000];int s[200];
int main()
{
	int i,j,m,n,mm=0,ans=0;
	cin>>m>>n;
    for (i=0;i<n;++i)
	{
		cin>>s[i];
		if(mm<s[i])
			mm=s[i];
    }
    for(i=1;i<=mm*m+3;++i)
		d[i]=10000;
	for (j=0;j<=mm*m;++j)
		 for (i=0;i<n;++i)
			if(d[j]<m&&d[j+s[i]]>1+d[j])
				d[j+s[i]]=1+d[j];
    while (d[ans+1]<=m)
		++ans;
	cout<<ans<<endl;
	return 0;
}
相關文章
相關標籤/搜索