AcWing 1023. 买书(完全背包求总方案数)

题目链接:点击这里

在这里插入图片描述
在这里插入图片描述状态定义:

F [ i , j ] F[i,j] 表示所有只从前 i i 个物品中选,并且总体积恰好为 j j 的方案数。

转移方程:

F [ i , v ] = s u m { F [ i 1 , v k C i ]     0 k C i v } F [i, v] = sum\left\{F [i − 1, v − kC_i] \ |\ 0 ≤ kC_i ≤ v\right\}

可优化成 F [ i , j ] = F [ i 1 , j ] + F [ i , j v ] F[i,j]=F[i-1,j]+F[i,j-v] (同是 i i ,可优化成一维空间)

初始化:

F [ 0 , 0 ] = 1 F[0,0]=1 ,其余为 0 0

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
const int N = 1010;

int f[N];

int a[4] = {10, 20, 50, 100};

int main()
{
    int n;
    scanf("%d", &n);
    
    f[0] = 1;
    for(int  i = 0; i < 4; ++i)
    {
        for(int j = a[i]; j <= n; ++j)
        {
            f[j] += f[j - a[i]];
        }
    }
    
    printf("%d\n", f[n]);
    
    return 0;
}
发布了822 篇原创文章 · 获赞 127 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/104963041