P07254. 数字的拆分之一
将数字N分成2份以上.使用的数字不可重复.例如5=1+4=2+3,就只有两种拆分的方式.输入: 每一行给出一个数字N,3<=N<=500.整个测试以0代表结束.
输入
本题有多组数据,整个测试以数字零代表结束
输出
输出有多行,每行一个数字,代表拆分的种数.
样例
输入复制
3
5
0
输出复制
1
2
Sol1:
#include<bits/stdc++.h>
using namespace std;
long long f[510][510];
int main()
{
int n;
f[0][0]=1;
for(int i=1; i<=6; i++)
{
for(int j=0; j<=6; j++)
{
f[i][j]=f[i-1][j];
if(j>=i)
f[i][j]+=f[i-1][j-i];
//cout<<i<<" "<<j<<" "<<f[i][j]<<endl;
}
}
while(cin>>n)
{
if(n==0) return 0;
cout<<f[n][n]-1<<"\n";
}
return 0;
}
#include <bits/stdc++.h>
#define int unsigned long long
using namespace std;
const int N=550;
int n,f[N];
signed main() {
while(scanf("%lld",&n)&&n){
memset(f,0,sizeof(f));
f[0]=1;
for(int i=1;i<n;i++)
for(int j=n;j>=i;j--)
f[j]=(f[j]+f[j-i]);
printf("%lld\n",f[n]);
}
return 0;
}
P07255. 数字的拆分之二
Description
将数字N进行拆分.拆分出来的数字可以重复使用.
Format
Input
每一行给出一个数字N,3<=N<=500.整个测试以0代表结束.
Output
拆分的种数.
Samples
输入数据 1
3
0
输出数据 1
3
说明: 3=3,3=1+1+1,3=1+2。
状态
阶段 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
4 |
3 |
1 |
1 |
2 |
3 |
4 |
5 |
7 |
8 |
4 |
1 |
1 |
2 |
3 |
5 |
6 |
9 |
11 |
5 |
1 |
1 |
2 |
3 |
5 |
7 |
10 |
13 |
6 |
1 |
1 |
2 |
3 |
5 |
7 |
11 |
14 |
#include<bits/stdc++.h>
using namespace std;
long long f[510][510];
int main()
{
int n;
f[0][0]=1;
for(int i=1; i<=500; i++)
{
for(int j=0; j<=500; j++)
{
f[i][j]=f[i-1][j];
if(j>=i)
f[i][j]+=f[i][j-i];
//cout<<i<<" "<<j<<" "<<f[i][j]<<endl;
}
}
while(cin>>n)
{
if(n==0) return 0;
cout<<f[n][n]<<"\n";
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int w[505];
int main()
{
int n;
memset(w,0,sizeof(w));
while(cin>>n && n!=0)
{
w[0]=1;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
w[j]+=w[j-i];
cout<<w[n]<<endl;
}
return 0;
}