A. Cut Ribbon
http://codeforces.com/contest/189/problem/A
Polycarpus has a ribbon, its length is n. He wants to cut the ribbon in a way that fulfils the following two conditions:
- After the cutting each ribbon piece should have length a, b or c.
- After the cutting the number of ribbon pieces should be maximum.
Help Polycarpus and find the number of ribbon pieces after the required cutting.
The first line contains four space-separated integers n, a, b and c (1 ≤ n, a, b, c ≤ 4000) — the length of the original ribbon and the acceptable lengths of the ribbon pieces after the cutting, correspondingly. The numbers a, b and c can coincide.
Print a single number — the maximum possible number of ribbon pieces. It is guaranteed that at least one correct ribbon cutting exists.
5 5 3 2
2
7 5 5 2
2
In the first example Polycarpus can cut the ribbon in such way: the first piece has length 2, the second piece has length 3.
In the second example Polycarpus can cut the ribbon in such way: the first piece has length 5, the second piece has length 2.
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a[3];
scanf("%d%d%d%d",&n,&a[0],&a[1],&a[2]);
int ans=1;
sort(a,a+3);
for(int i=0;i<=n/a[2];i++)
{
for(int j=0;j<=n/a[1];j++)
{
if((n-a[2]*i-a[1]*j)%a[0]==0)
{
ans=max(ans,i+j+(n-a[2]*i-a[1]*j)/a[0]);
}
}
}
printf("%d\n",ans);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[3],n;
scanf("%d%d%d%d",&n,&a[0],&a[1],&a[2]);
sort(a,a+3);
int ans=1;
if(n%a[0]==0)
{
printf("%d\n",n/a[0]);
return 0;
}
int e=0;
for(int i=0;i<=n/a[2];i++)
{
for(int j=0;j<=n/a[1];j++)
{
for(int k=0;k<=n/a[0];k++)
{
if(i*a[2]+j*a[1]+k*a[0]==n)
{
e++;
ans=max(ans,i+j+k);
if(e==5)
{
printf("%d\n",ans);
return 0;
}
}
}
}
}
printf("%d\n",ans);
return 0;
}
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int main()
{
int n,a,b,c;
cin>>n>>a>>b>>c;
int dp[5050];
memset(dp,-inf,sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;i++)
{
if(i>=a)
dp[i]=max(dp[i-a]+1,dp[i]);
if(i>=b)
dp[i]=max(dp[i-b]+1,dp[i]);
if(i>=c)
dp[i]=max(dp[i-c]+1,dp[i]);
}
printf("%d\n",dp[n]);
return 0;
}
Let's call a string "s-palindrome" if it is symmetric about the middle of the string. For example, the string "oHo" is "s-palindrome", but the string "aa" is not. The string "aa" is not "s-palindrome", because the second half of it is not a mirror reflection of the first half.
You are given a string s. Check if the string is "s-palindrome".
The only line contains the string s (1 ≤ |s| ≤ 1000) which consists of only English letters.
Print "TAK" if the string s is "s-palindrome" and "NIE" otherwise.