题意:给出一块长度为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;
}