好长时间没有发新的博客(其实是因为一直在更新背包问题)
名副其实,就是求方案数:
以洛谷上 质数和分解
这个题为例:
可以明显看出这是一个完全背包,因为每个物品都可以选无数次,其实本蒟蒻觉得动规题首先考虑的就是背包
那什么是费用什么又是价值呢?
我们要求得是方案数,那么方案数就是价值
那么,我们要凑的数就是体积,要凑的数就是容量
#include<bits/stdc++.h> using namespace std; int ss[201]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0, 1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,1,0,} ;//这是200以内某个数是否为素数的表 int a[10001],w[10001],v[10001],i,j,n,m,l;//w[]是体积,v[]是价值,a[][]的话就是我们平常用的f[][]数组 int main() { int ans=0; while(scanf("%d",&n)!=EOF){//输入 if(n==2){ cout<<"1"<<endl; continue; } a[0]=1;//初始化 for(i=1;i<=n;i++){//枚举一到n if(ss[i]==1){//是素数就可以选择选或不选 for(j=i;j<=n;j++){ a[j]+=a[j-i];//如果j-i能凑出n个,并且i也能凑出,那么a[j]就又有n中方案 } } } cout<<a[n]<<endl; memset(a,0,sizeof(a));//多测不清空,爆0两行泪 } return 0; }