1252 Euro Efficiency

問題概要

6種類のコインの価値が与えられる。
このとき1〜100の値段を支払うのに使うコインの最小の枚数の平均値を求めよ。


ただし支払いに使うコインの枚数は、こちらが渡すコインの枚数と、おつりで貰うコインの枚数の和を表すものとする。

解法

金額xをつくるコインの最小枚数は最初にdpで求める。
金額xの支払いのコインの最小枚数は、i=x〜3000くらいを動かして、
支払う枚数+おつりの枚数の最小値を探索する。

ソースコード

int n,c[6],dp[3001],dp2[101];

int main()
{
	scanf("%d",&n);
	rep(i,n)
	{
		rep(j,6)scanf("%d",c+j);
		rep(j,3001)dp[j]=dp2[j]=inf; dp[0]=0;
		
		rep(j,3001)rep(k,6)if(j+c[k]<3001)dp[j+c[k]]=min(dp[j+c[k]],dp[j]+1);
		rep(j,101)for(int k=j;k<3001;k++)dp2[j]=min(dp2[j],dp[k]+dp[k-j]);
		
		int s=accumulate(dp2+1,dp2+101,0),m=*max_element(dp2+1,dp2+101);
		printf("%.2f %d\n",s/100.0,m);
	}
	
	return 0;
}