Codeforces 189A

题意:给出一块长度为n的布,还有将这块布尽量的剪成最多块,但是剪出来的每一块小布的长度都必须是a或b或c这三个固定长度的一种;求最多能剪出多少块布。

思路:简单的DP。。。状态转移方程如下

dp[j + a] = max(dp[j + a], dp[j] + 1);        
dp[j + b] = max(dp[j + b], dp[j] + 1);
dp[j + c] = max(dp[j + c], dp[j] + 1);

1=<j <=n;

感想:这是DIV2的A题,居然要DP!!!我的天啊!幸好我没参加。。不然要被弄死。。开始做的时候用先写了个暴力玩玩,不过很明显会TLE,特别是CF上的数据(出了名的强),然后题目的标签上的唯一一种做法是DP,然后就各种胡搞。。开始时还想复杂了,用了set来做,错误后看数据发现这个做法行不通,反而换成个简单点的再糊弄一下,找点规律就过了。。也是在学DP的路上一个小小的进步啊。对DP稍稍有点眉目了;恩!继续加油!!

#include<iostream>
#include<algorithm>
using namespace std;

const int N = 10010;
int dp[N];

int main() {
	int n, a, b, c, i, j;
	cin >> n >> a >> b >> c;
	dp[a] = 1, dp[b] = 1, dp[c] = 1;
    for(j = 1;j <= n;j++)
        if(dp[j]) {
            dp[j + a] = max(dp[j + a], dp[j] + 1);
            dp[j + b] = max(dp[j + b], dp[j] + 1);
            dp[j + c] = max(dp[j + c], dp[j] + 1);
        }
	cout << dp[n] <<endl;
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值