CodeForces 189A Cut Ribbon

来源:互联网 发布:cacti windows模板 编辑:程序博客网 时间:2024/06/08 13:08

题意:给出四个数n,a,b,c,将长度为n的木棍恰好分割成若干段长度分别为a,b,c的小段,求最多能有几段

链接:http://codeforces.com/problemset/problem/189/A

思路:dp,近似完全背包,加一个判断条件dp[i-k] != 0

注意点:无


以下为AC代码:

#AuthorProblemLangVerdictTimeMemorySentJudged10042577Practice:
luminous11189A -38GNU C++11Accepted62 ms24 KB2015-02-27 12:39:582015-02-27 12:39:58

#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <vector>#include <deque>#include <list>#include <cctype>#include <algorithm>#include <climits>#include <queue>#include <stack>#include <cmath>#include <map>#include <set>#include <iomanip>#include <cstdlib>#include <ctime>#define ll long long#define ull unsigned long long#define all(x) (x).begin(), (x).end()#define clr(a, v) memset( a , v , sizeof(a) )#define pb push_back#define mp make_pair#define read(f) freopen(f, "r", stdin)#define write(f) freopen(f, "w", stdout)using namespace std;const double pi = acos(-1);//Problem Aint dp[5000];int main(){    ios::sync_with_stdio( false );    int n, a, b, c;    while ( cin >> n >> a >> b >> c ){        clr ( dp, 0 );        dp[a] = dp[b] = dp[c] = 1;        for ( int i = a; i <= n; i ++ ){            if ( dp[i-a] )                dp[i] = max ( dp[i], dp[i-a] + 1 );        }        for ( int i = b; i <= n; i ++ ){            if ( dp[i-b] )                dp[i] = max ( dp[i], dp[i-b] + 1 );        }        for ( int i = c; i <= n; i ++ ){            if ( dp[i-c] )                dp[i] = max ( dp[i], dp[i-c] + 1 );        }        cout << dp[n] << endl;    }    return 0;}


0 0
原创粉丝点击