题解 | #汽水瓶#

汽水瓶

https://www.nowcoder.com/practice/fe298c55694f4ed39e256170ff2c205f

#include <stdio.h>
//使用动态规划解决问题
int maxnum(int a)
{
    int res=0,i=2;
    int dp[500];
    dp[1]=a/3+a%3;
    res=a/3;
    for(i=2;dp[i-1]>1;i++)
        if(dp[i-1]>2)
        {
            dp[i]=dp[i-1]/3+dp[i-1]%3;
            res+=dp[i-1]/3;
        } else if(dp[i-1]==2)
        {
            dp[i]=1;
            res+=1;
        }
    
    return res;
}

int main() {
    int num,flag=0;
    while (scanf("%d", &num) != EOF) {  
        if(num!=0)
        {
            flag = maxnum(num);
            printf("%d\n",flag);
        }
        
    }
    return 0;
}

解题思路:

可以将换汽水瓶分为i次兑换,设dp[i]为第i次兑换后剩余的空汽水瓶数。而第i次兑换后所剩的空汽水瓶数依赖于第i-1次所剩的空汽水瓶数。这样就能得到一个状态转移方程式(dp[i]=1作为临界条件):

dp[1]=原始空汽水瓶数量m/3;

当dp[i-1]>2时,

dp[i]=dp[i-1]/3+dp[i-1]%3;

当dp[i-1]=2

dp[i]=1

然后使用一个变量res来统计可兑换的汽水数量。

#算法刷题#
全部评论

相关推荐

本神尊:看来是没招到小红薯上的人
点赞 评论 收藏
分享
05-19 19:57
蚌埠学院 Python
2237:Gpa70不算高,建议只写排名,个人技能不在多而在精,缩到8条以内。项目留一个含金量高的,减少间距弄到一页,硕士简历也就一页,本科不要写很多
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务