1 条题解

  • 0
    @ 2023-3-13 12:01:55

    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

    信息

    ID
    1959
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者