100248A

来源:互联网 发布:网点纸淘宝 编辑:程序博客网 时间:2024/06/04 20:11
这是个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]也是最优,并没有什么意义
因为。。。
再从右往左更新
#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;}


0 0
原创粉丝点击