一个长方体,长宽高分别为x,y,z,都为自然数。
现在要把若干个相同的长方体摆成高为N的一根柱形体。
每层摆1个,如果两种摆法的高度是一样的,则认为这两种摆法等价,所以每层只有三种摆法。
求一共有多少种摆法。
第一行为一个数字N,N>=1且N<=100,表示要摆放的高度
第二行为长方体的长宽高,x、y、z都为无符号整数,按升序排列。
摆法总数,已知该总数会小于10000000
10 5 6 7
1
如果没有任何一种摆法可以达成目的,输出0
设dp[i][j]为第i层,高度为j的方案数,那么第i+1层的高度为j+x j+y j+z的方案数都等于第i层的
方案数,所以可以得出递推式为:
dp[i+1][j+x]+=dp[i][j]
dp[i+1][j+y]+=dp[i][j]
dp[i+1][j+z]+=dp[i][j]
再把高度为n的方案数加起来得出总和即可。
代码为:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int x=sc.nextInt();
int y=sc.nextInt();
int z=sc.nextInt();
int[][] dp=new int[200][400];
dp[1][x]=1;
dp[1][y]=1;
dp[1][z]=1;
for(int i=2;i<200;i++){
for(int j=0;j<300;j++){
dp[i][j+x]+=dp[i-1][j];
dp[i][j+y]+=dp[i-1][j];
dp[i][j+z]+=dp[i-1][j];
}
}
int sum=0;
for(int i=0;i<200;i++){
sum+=dp[i][n];
}
System.out.println(sum);
sc.close();
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] params = br.readLine().split(" ");
int x = Integer.parseInt(params[0]);
int y = Integer.parseInt(params[1]);
int z = Integer.parseInt(params[2]);
System.out.println(dfs(x, y, z, n));
}
private static int dfs(int x, int y, int z, int rest) {
if(rest == 0) return 1; // rest为0,凑出了一种合法的方案
if(rest < 0) return 0; // rest小于0,当前摆放方案不合理
// 分别尝试x,y,z作为本层的高度
return dfs(x, y, z, rest - x) + dfs(x, y, z, rest - y) + dfs(x, y, z, rest - z);
}
} #include<stdio.h>
/*
* n:题目中的n
* now:当前高度
* x,y,z:长宽高
* */
int sumAll(int n,int now,int x,int y,int z){
int sum=0;
if(now+x==n){
sum++;
}
if(now+y==n){
sum++;
}
if(now+z==n){
sum++;
}
if(now+x<n){
sum=sum+sumAll(n,now+x,x,y,z);
}
if(now+y<n){
sum=sum+sumAll(n,now+y,x,y,z);
}
if(now+z<n){
sum=sum+sumAll(n,now+z,x,y,z);
}
return sum;
}
int main(){
int n;
scanf("%d",&n);
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
int sum=sumAll(n,0,x,y,z);
printf("%d",sum);
return 0;
} #include<iostream>
using namespace std;
int a, b, c;
int aim;
int key = 0;
void ceng(int aim)
{
if (aim > a)
{
ceng(aim - a);
}
if (aim > b)
{
ceng(aim - b);
}
if (aim > c)
{
ceng(aim - c);
}
if (aim == a || aim == b || aim == c)
{
key = key + 1;
}
if (aim < a && aim < b && aim < c)
return;
}
int main()
{
cin >> aim;
cin >> a >> b >> c;
ceng(aim);
cout << key;
} package main
import (
"bufio"
"os"
"strings"
"strconv"
"fmt"
)
func main() {
inputReader := bufio.NewReader(os.Stdin)
line0, _ := inputReader.ReadString('\n')
line0 = strings.Replace(line0, "\n", "", -1)
n, _ := strconv.Atoi(line0)
line1, _ := inputReader.ReadString('\n')
line1 = strings.Replace(line1, "\n", "", -1)
lines1 := strings.Split(line1, " ")
nums:=[]int{}
for _,s:=range lines1{
temp, _ := strconv.Atoi(s)
nums=append(nums, temp)
}
dp:=make([]int,n+1)
dp[0]=1
for i:=1;i<=n;i++{
for _,v:=range nums{
if i>=v{
dp[i]+=dp[i-v]
}
}
}
fmt.Print(dp[n])
} JS写的,内存超出限制,大佬们有空可以改改
var height =parseInt(readline());
var nums = readline();
var arr=nums.split(' ');
var s=[];
let a=[];
for(var i=0;i<arr.length;i++){
s.push(parseInt(arr[i]));
}
//console.log(s);
backUp(height,0,s,0);
console.log(a[a.length-1]);
function backUp(height,n,s,sum){
if(height<n){
return;
}
if(height===n){
sum++;
a.push(sum);
}
if(height>n){
for(var i=0;i<3;i++){
backUp(height,n+s[i],s,sum);
}
}
} N = int(input())
a,b,c=list(map(int, input().split()))
cfx=[a,b,c]
mxcount = [N//a, N//b, N//c]
allres = []
def dfs(cur, n, st):
if cur == 3:
if n == 0:
allres.append(list(map(int, st.split(',')[1:])))
return
for i in range(0, mxcount[cur]+1):
num = n - cfx[cur]*i
if num>=0:
dfs(cur+1, num, st+','+str(i))
else:
return
return
# 求Akk
def getA(k):
res = 1
for i in range(1, k+1):
res *= i
return res
dfs(0, N, '')
sum = 0
for x,y,z in allres:
t = x+y+z
sum+= getA(t)//(getA(x)*getA(y)*getA(z))
print(sum) #include<iostream>
#include<cstdio>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<stack>
#include<cstring>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
const ll maxn = 2e5 + 10;
ll a,b,c, f[200];
ll n,k,ans;
ll v[200];
int main()
{
//freopen("input.c", "r", stdin);
cin>>n;
cin>>a>>b>>c;
if(a == b && b == c){
v[1] = a;
k = 1;
}
else if(a == b && b != c){
v[1] = a; v[2] = c;
k = 2;
}
else if(a != b && b == c){
v[1] = a; v[2] = b;
k = 2;
}
else{
v[1] = a; v[2] = b; v[3] = c;
k = 3;
}
f[0] = 1;
for(int i = 0; i <= n; i ++){
for(int j = 1; j <= k; j ++){
if(v[j] <= i) f[i] += f[i-v[j]];
}
}
cout<<f[n]<<endl;
return 0;
}
#include <iostream>
#include <cstdio>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
int opre_kinds=0;
void comb(vector<int>size,int sum,int cur){
// cout << cur <<endl;
for(int i=0;i<size.size();i++){
if(cur+size[i]==sum){
opre_kinds++;
return ;
}
else if(cur+size[i]>sum){
return ;
}
else
comb(size,sum,cur+size[i]);
}
}
int main(int argc, char const *argv[])
{
int N;
int x,y,z;
while (scanf("%d",&N)!=EOF)
{
opre_kinds=0;
scanf("%d %d %d",&x,&y,&z);
vector<int> size;
size.push_back(x);
if(y!=x)
size.push_back(y);
if(z!=x && z!=y)
size.push_back(z);
std::sort(size.begin(),size.end());
comb(size,N,0);
cout << opre_kinds <<endl;
}
return 0;
}