• 动态规划——方案问题


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

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

    以洛谷上 质数和分解

    这个题为例:

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

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

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

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

    #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;
    }
  • 相关阅读:
    NAT基本原理及应用
    端口转发和端口映射的区别
    Xshell不能连接Kali系统SSH的解决
    PowerSploit
    powertool
    Windows/Linux 下反弹shell
    Apache Shiro 反序列化漏洞复现(CVE-2016-4437)
    渗透测试神器Cobalt Strike使用教程
    Notepad++ 小技巧
    Linux:Day44(上)
  • 原文地址:https://www.cnblogs.com/lztzs/p/10818061.html
Copyright © 2020-2023  润新知