题目描述
完全背包问题的cnt例题
注意:在初始化价格数组时,要在第0位补上0,从1开始遍历,防止坐标越界
#include <iostream>
using namespace std;
const int N=1010;
int f[N];
int main()
{
int a[]={0,10,20,50,100};
int n;
cin>>n;
f[0]=1;
for(int i=1;i<=4;i++)
{
for(int j=1;j<=n;j++)
{
if(j>=a[i])
f[j]=f[j]+f[j-a[i]];
}
}
cout<<f[n];
return 0;
}
2023/11/27
完全背包,cnt,“恰好为”
#include <iostream>
#include <cstring>
using namespace std;
int a[5] = {0, 10,20,50,100};
const int N=1010;
// fij: 在前i本书中买,总价格"q恰好为"j元的方案数
int f[10][N];
int n;
int main()
{
cin>>n;
f[0][0] = 1;
for(int i=1;i<=4;i++)
{
for(int j=0;j<=n;j++)
{
f[i][j] = f[i-1][j];
if(j >=a[i])
{
f[i][j] = f[i][j] + f[i][j-a[i]];
}
}
}
cout<<f[4][n];
return 0;
}
注意,此题要求必须把钱正好花完,如果不必花完所有钱,“不超过”类型的问题.
和“恰好为”的区别: 仅在初始化时有区别!!
恰好为:初始化f[0][0] = 1;
不超过:f[0][i]都初始化为1:不考虑任何书,花费不超过i元的情况,显然都为1
for(int i = 0; i <= n; i ++)
f[0][i] = 1;
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1010;
int f[N];
int n;
int a[] = {0, 10, 20, 50, 100};
int main()
{
cin >> n;
//初始化不同,f[0][i]都初始化为1:不考虑任何书,花费不超过i元的情况,显然都为1
for(int i = 0; i <= n; i ++)
f[i] = 1;
for(int i = 1; i <= 4; i ++)
{
for(int j = a[i]; j <= n; j ++)
{
f[j] += f[j - a[i]];
}
}
cout << f[n];
return 0;
}