1 solutions

  • 0
    @ 2025-3-3 16:21:26

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    
    /*
      将要凑出的数看成背包的容量
      所有可以用的物品是1~n n个物品
      每个物品的体积是 1~n
      问题转换为:给定1~n,n个物品,背包容量为n,求装满背包的方案数
      由于每个数可以选多次,该问题就是完全背包的问题
      
      DP分析法:
      (1)状态表示:f[i,j] 
            集合:所有从前i个物品选,且总体积恰好是j的所有选择方案的集合
    	    属性:集合中元素的数量 
      (2)状态计算: 
          所有不包含第i个物品的方案:f[i-1,j]
    	  所有包含第i个物品的方案:f[i-1,j-k*vi]:可以考虑为第i个物品一定有,那么就转换为在i-1个物品的情况下,凑出背包容量为j-k*vi的方案数
    	  因此:f[i,j] = f[i-1,j] + f[i-1,j-k*vi]
    	 可以用滚动数组优化: 
    */
    
    
    
    long long base=2147483648LL;//默认数字为int类型,因此数字后要加LL
    int n;
    long long f[4005];
    
    int main(){
    	cin>>n;
    	f[0]=1;
        for(int i=1;i<n;i++)
            for(int j=i;j<=n;j++)
                f[j]=(f[j]+f[j-i])%base;
        cout<<f[n];
    }
    
    
    • 1

    Information

    ID
    9945
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By