codeforces 189A. Cut Ribbon
2016-08-15 16:16
507 查看
题目链接:http://www.codeforces.com/problemset/problem/189/A
题意:有一块长为n的布,现在要把它剪开,只能剪成长度为a, b, c的小块布。求最多能剪成多少块。
思路:一个必须装满的完全背包问题。我们设dp[i]表示长度为i的布最多能剪成多少块,那么dp[i] = 只能被dp[i - a], dp[i - b], dp[i - c]更新,还有一点,如果以上三者都为零的话,证明此点不会被更新,直接dp即可。为了边界处理简单,所以采用记忆化搜索。
代码如下:
题意:有一块长为n的布,现在要把它剪开,只能剪成长度为a, b, c的小块布。求最多能剪成多少块。
思路:一个必须装满的完全背包问题。我们设dp[i]表示长度为i的布最多能剪成多少块,那么dp[i] = 只能被dp[i - a], dp[i - b], dp[i - c]更新,还有一点,如果以上三者都为零的话,证明此点不会被更新,直接dp即可。为了边界处理简单,所以采用记忆化搜索。
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <vector> #include <cmath> #include <cstdlib> typedef long long ll; const int MAXN = 4000 + 100; int dp[MAXN], a[3]; int dfs(int x){ if(x <= 0){ return 0; } if(dp[x] != -1){ return dp[x]; } if(x == a[2] || x == a[1]){ dp[x] = std::max(dfs(x - a[2]), std::max(dfs(x - a[1]), dfs(x - a[0]))) + 1; return dp[x]; } dp[x] = std::max(dfs(x - a[2]), std::max(dfs(x - a[1]), dfs(x - a[0]))); if(dp[x]){ ++dp[x]; } return dp[x]; } int main(){ int n; scanf("%d %d %d %d", &n, a, a + 1, a + 2); std::sort(a, a + 3); memset(dp, -1, sizeof(dp)); dp[a[0]] = 1; printf("%d\n", dfs(n)); //for(int i = 1; i <= n; ++i){ //printf("%d ", dp[i]); //} //puts(""); return 0; }
相关文章推荐
- Color Stripe--codeForces 219C
- codeforces Exam
- Codeforces 283B Distinct Paths (dfs+剪枝)
- CodeForces 140C New Year Snowmen
- CodeForces - 729D Sea Battle(思维题)
- Codeforces 849C From Y to Y【思维】
- codeforces 4A
- codeforces 150C Smart Cheater
- Codeforces 515C Drazil and Factorial
- CodeForces-632B-Alice, Bob, Two Teams
- codeforces-367#A. Beru-taxi
- Codeforces 599C Day at the Beach【思维+优先队列】
- CodeForces - 820
- Codeforces 585E Present for Vitalik the Philatelist [容斥原理]
- codeforces 246/D Colorful Graph
- codeforces 520 Two Buttons
- Codeforces 585E Present for Vitalik the Philatelist (莫比乌斯反演)
- CodeForces 711A. Bus to Udayland【StringBuilder】
- Codeforces 746 G. New Roads
- Codeforces 849 C. From Y to Y 结论题