zoukankan      html  css  js  c++  java
  • 1244. Gentlemen 夜

    http://acm.timus.ru/problem.aspx?space=1&num=1244

    背包题  理解并不难

    主要在于如果答案有多个要输出 -1

    一个答案的话要输出结果   否则输出 0

    用 sum [ n ] 表示到 n 有几条路径

    状态转移方程为 

    if(sum[j-a[i]])//a[i]表示第i个数据的大小

    {
            sum[j]=max(sum[j]+1,sum[j-a[i]]);

    }

    代码及其注释:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    #define LL long long
    
    using namespace std;
    
    const int N=100003;
    int sum[N];//到 N 有几条路径
    int f[N];// 记录第一次到此用了那个数据
    int a[103];// 数据大小
    bool select[103];//是否用了
    void Fselect(int x)//记录用了哪几个数据
    {
        while(x)
        {
            select[f[x]]=true;
            x=x-a[f[x]];
        }
    }
    int main()
    {
        //freopen("data.txt","r",stdin);
        int K,n;
        while(scanf("%d %d",&K,&n)!=EOF)
        {
            memset(sum,0,sizeof(sum));
            sum[0]=1;
            memset(select,false,sizeof(select));
            int m=0;
            for(int i=1;i<=n;++i)
            {
                scanf("%d",&a[i]);
                if(sum[K]>1)//如果答案有多个 则无需再找
                continue;
                m=min(m+a[i],K);//最大
                for(int j=m;j>=a[i];--j)
                {
                    if(sum[j]==0)//如果是求得第一条到此路径 记录用了哪一数据
                    {
                        f[j]=i;
                    }
                    if(sum[j-a[i]])//更新到此路径数目
                    {
                       sum[j]=max(sum[j]+1,sum[j-a[i]]);
                    }
                }
                if(sum[K]==1)
                Fselect(K);
            }
            if(sum[K]==0)
            {printf("0\n");continue;}
            if(sum[K]>1)
            {printf("-1\n");continue;}
            for(int i=1;i<=n;++i)
            {
                if(!select[i])
                printf("%d ",i);
            }
            printf("\n");
        }
        return 0;
    }
    
  • 相关阅读:
    2019-05-07
    2019-04-28 问题记录
    2019-04-15 python深浅复制
    2019-04-11 统计日志重复数量
    2019-03-23 shell练习,日志统计
    问题记录2019-03-12
    问题记录2019-03-06(todo)
    回归
    Mac进行 usr/bin 目录下修改权限问题,operation not permitted
    个人的随笔心情
  • 原文地址:https://www.cnblogs.com/liulangye/p/2682017.html
Copyright © 2011-2022 走看看