这是个dp。被老师批评了。。。看书不认真。。。只会看答案。。。
怎么dp呢?
dp[i]:到i元钱的步数
从左往右更新:dp[i]=dp[i-a[i]]+1 min()
为什么不从i-a[i],i-2*a[i],i-3*a[i]更新呢?
因为如果i-a[i]能更新,证明当前最优,如果i-2*a[i]也是最优,并没有什么意义
因为。。。
再从右往左更新
怎么dp呢?
dp[i]:到i元钱的步数
从左往右更新:dp[i]=dp[i-a[i]]+1 min()
为什么不从i-a[i],i-2*a[i],i-3*a[i]更新呢?
因为如果i-a[i]能更新,证明当前最优,如果i-2*a[i]也是最优,并没有什么意义
因为。。。
再从右往左更新
#include<iostream>
#include<cstdio>
using namespace std;
int T;
int dp[100010],a[10];
int main()
{
cin>>T;
while(T--)
{
for(int i=0;i<=10001;i++)
dp[i]=1<<30;
dp[0]=0;
for(int i=0;i<6;i++)
scanf("%d",&a[i]);
for(int i=1;i<=10001;i++)
{
for(int j=0;j<6;j++)
{
if(i-a[j]>=0)
dp[i]=min(dp[i],dp[i-a[j]]+1);
}
}
for(int i=10001;i>=1;i--)
{
for(int j=0;j<6;j++)
{
dp[i]=min(dp[i],dp[i+a[j]]+1);
}
}
double tot=0;
int ans=0;
for(int i=1;i<=100;i++)
{
ans=max(ans,dp[i]);
tot+=dp[i];
}
printf("%.2lf %d\n",tot/100,ans);
}
return 0;
}