动态规划——方案问题

好长时间没有发新的博客(其实是因为一直在更新背包问题)

名副其实,就是求方案数:

以洛谷上 质数和分解

这个题为例:

可以明显看出这是一个完全背包,因为每个物品都可以选无数次,其实本蒟蒻觉得动规题首先考虑的就是背包

那什么是费用什么又是价值呢?

我们要求得是方案数,那么方案数就是价值

那么,我们要凑的数就是体积,要凑的数就是容量

#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;
}
原文地址:https://www.cnblogs.com/lztzs/p/10818061.html