zoukankan      html  css  js  c++  java
  • URAL1224——背包DP+回溯——Gentlemen

    Description

    Let's remember one old joke:
    Once a gentleman said to another gentleman:
    — What if we play cards?
    — You know, I haven't played cards for ten years…
    — And I haven't played for fifteen years…
    So, little by little, they decided to resurrect their youth. The first gentleman asked a servant to bring a pack of cards, and before starting playing out weighed in his hand the pack.
    — It seems to me, one card is missing from the pack… — he said and gave the pack to the other gentleman.
    — Yes, the nine of spades, — the man agreed.
    An incomplete pack of cards is given. The program should determine which cards are missing.

    Input

    The first line contains a positive integer, which is the weight in milligrams of the given incomplete pack. The second line contains an integer N, 2 ≤ N ≤ 100 — the number of cards in the complete pack. In the next N lines there are integers from 1 to 1000, which are the weights of the cards in milligrams. It's guaranteed that the total weight of all cards in the complete pack is strictly greater than the weight of the incomplete pack.

    Output

    If there is no solution, then output the single number 0. If there are more than one solutions, then you should write −1. Finally, if it is possible to determine unambiguously which cards are missing in the incomplete pack as compared to the complete one, then output the numbers of the missing cards separated with a space in ascending order.

    Sample Input

    inputoutput
    270
    4
    100
    110
    170
    200
    
    2 4
    
    270
    4
    100
    110
    160
    170
    
    -1
    
    270
    4
    100
    120
    160
    180
    
    0
    

    大意:输入一个m,表示当前剩下的纸牌的重量,接下来n行表示完整的牌的重量,每种牌只有一张,让你求缺少的牌是哪些。

    用所有的牌的总重量减去当前不完整牌的重量,就是所缺少的牌的重量,然后进行01背包,不过dp记录的是情况数目所以回溯的时候不能用i = path[i],只能枚举倒着递推

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int w[110];
    int dp[100100];
    int path[100100];
    int print[110];
    int main()
    {
        int m,n;
        while(~scanf("%d%d",&m,&n)){
            int sum = 0;
            for(int i = 1; i <= n ; i++){
                scanf("%d",&w[i]);
                sum += w[i];
            }
            memset(dp,0,sizeof(dp));
            dp[0] = 1;
            sum -= m;
           for(int i = 1; i <= n ;i++){
               for(int j = sum - w[i]; j >= 0 ;j--){
                   if(dp[j]){
                        if(!dp[j+w[i]])
                            path[j+w[i]] = i;
                        dp[j+w[i]] += dp[j];
                   }
               }
           }
           if(dp[sum] == 0)
               printf("0
    ");
           else if(dp[sum] == 1){
               int j = 1;
               for(int i = n ; i >= 1; i --){
                   if(path[sum] == i){
                       print[j++] = i;
                       sum -= w[i];
                   }
               }
               for(int i = j - 1; i > 1;i--)
                   printf("%d ",print[i]);
               printf("%d
    ",print[1]);
           }
           else printf("-1
    ");
        }
        return 0;
    }
    

      

  • 相关阅读:
    JavaWeb下载文件response
    jQuery的prop和attr的区别,及判断复选框是否选中
    【转载并整理】mysql 创建用户,数据库
    【转载】mysql配置模板(my-*.cnf)参数详细说明
    【转载】mysql 热备份
    【转载】centos 安装及配置 mysql5.5.3
    【微信开发】简单的微信分享小插件
    一些http或https请求的参数,什么情况下需要urlencode编码
    sublime在混杂的log数据中提取你想要的内容
    聊聊分布式事务【转】
  • 原文地址:https://www.cnblogs.com/zero-begin/p/4497157.html
Copyright © 2011-2022 走看看