• hdu1085 多重部分和问题


      题目大意是给定1 2 5的数量 a, b, c, 问1 2 5不能组成的最小的数是多少?可以使用dp来解决, 定义dp[i][j]为前i种组成j的时候第i中数剩余多少, 那么

      dp[i][j] = mi (dp[i-1][j]>=0)   -1 (a[i]>j || dp[i][j-a[i]]<=0)   dp[i][j-a[i]]-1 (其他), 代码如下:

      

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    int a[5] = {0, 1, 2, 5};
    int m[5];
    int dp[5][15000+10];    //前i中组成j的时候 第i种剩余多少
    
    int main()
    {
        while(cin>>m[1]>>m[2]>>m[3])
        {
            if(m[1]==0 && m[2]==0 && m[3]==0) break;
            memset(dp, -1, sizeof(dp));
            dp[0][0] = 0;
            for(int i=1; i<=3; i++)
                for(int j=0; j<=15000; j++)
                {
                    if(dp[i-1][j] >= 0) dp[i][j] = m[i];
                    else if(a[i]>j || dp[i][j-a[i]]<=0) dp[i][j] = -1;
                    else dp[i][j] = dp[i][j-a[i]]-1;
                }
            int res;
            for(int j=0; j<=15000; j++)
                if(dp[3][j] == -1)
                {
                    res = j;
                    break;
                }
            cout<<res<<endl;
        }
        return 0;
    }
  • 相关阅读:
    内核态内存映射
    FS 数据结构
    内存页分配/释放
    用户态内存映射
    WindowsServer 2008 TIME_WAIT
    OutOfMemoryError:修改tomcat启动参数
    windows下Tomcat添加jmx监控
    mysql 5.7.11 安装运行
    mysql 数据库备份与还原
    Win7下虚拟WiFi设置
  • 原文地址:https://www.cnblogs.com/xingxing1024/p/5216777.html
Copyright © 2020-2023  润新知