Accepted Necklace

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 53   Accepted Submission(s) : 11

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

I have N precious stones, and plan to use K of them to make a necklace for my mother, but she won't accept a necklace which is too heavy. Given the value and the weight of each precious stone, please help me find out the most valuable necklace my mother will accept.

Input

The first line of input is the number of cases.
For each case, the first line contains two integers N (N <= 20), the total number of stones, and K (K <= N), the exact number of stones to make a necklace.
Then N lines follow, each containing two integers: a (a<=1000), representing the value of each precious stone, and b (b<=1000), its weight.
The last line of each case contains an integer W, the maximum weight my mother will accept, W <= 1000.

Output

For each case, output the highest possible value of the necklace.

Sample Input

1
2 1
1 1
1 1
3 
先超时杭电上提交,后加了个判重,修改前:
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;int val[1002],wei[1002];
int sum;
int case1,n,k,w;
int best;
bool vis[1002];void dfs(int v,int we,int sum)
{
    int i;
    if(sum>k)        return ;
    if(we>w)         return ;
    if(sum==k&&we<=w&&best<v)  best=v;
    for(i=1;i<=n;i++)
    {
        if(!vis[i]&&we<w&&sum<k)
        {
            vis[i]=1;
             v+=val[i];
             we+=wei[i];
             sum++;
             dfs(v,we,sum);
             v-=val[i];
             we-=wei[i];
             sum--;
             vis[i]=0;
        }
    }
}int main()
{
    int i;scanf("%d",&case1);
    while(case1--)
    {
        cin>>n>>k;
        for(i=1;i<=n;i++)
        {
         cin>>val[i]>>wei[i];
        }
        cin>>w;
        memset(vis,0,sizeof(vis));
        best=0;
        dfs(0,0,0);
        printf("%d\n",best);
    }
    return 0;
}
修改后:
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;int val[1002],wei[1002];
int sum;
int case1,n,k,w;
int best;
bool vis[1002];void dfs(int v,int we,int sum,int first)
{
    int i;
    if(sum>k)        return ;
    if(we>w)         return ;
    if(sum==k&&we<=w&&best<v)  best=v;
    for(i=first;i<=n;i++)
    {
        if(!vis[i]&&we<w&&sum<k)
        {
            vis[i]=1;
             v+=val[i];
             we+=wei[i];
             sum++;
             dfs(v,we,sum,i+1);
             v-=val[i];
             we-=wei[i];
             sum--;
             vis[i]=0;
        }
    }
}int main()
{
    int i;scanf("%d",&case1);
    while(case1--)
    {
        cin>>n>>k;
        for(i=1;i<=n;i++)
        {
         cin>>val[i]>>wei[i];
        }
        cin>>w;
        memset(vis,0,sizeof(vis));
        best=0;
        dfs(0,0,0,1);
        printf("%d\n",best);
    }
    return 0;
}
参考网上的代码:
这道题目是DFS题目,但又参杂了多重背包问题。开始我了3次都是Time limited。。
后来才知道又有多重背包问题,多重背包即要考虑重复问题,
即加个参数考虑下重复的情况就O了AC啦。
关键点: DFS考虑第1是否用时,然后递归用后面的2--N个,组合起来看是否组成最大价值的
项链,将其保存;接下来循环就从第2个开始,不需要在管第1个背包了,否则重复;
举例: 3 4 5 6 == 4 3 5 6 == 5 3 6 4这个道理,所以下面代码中的DFS中FOR循环是
START开始的。
 


Accepted Necklace相关推荐

  1. Accepted Necklace HDU - 2660

    Accepted Necklace HDU - 2660 WA wa了两发又双叒叕是因为没读清楚题我裂开 AC代码 好家伙一手最low的dp竟然过了,我还一直不敢交hhhh #include < ...

  2. HDU-2660 Accepted Necklace

    GDUT 2020寒假训练 专题一 D 原题链接 HDU-2660 Accepted Necklace GDUT-专题1-D BFS/DFS 题目大意 有N个石头想要从中选出K个做成项链,每颗石头有自 ...

  3. HDU 2660 Accepted Necklace

    编辑器加载中... 转载于:https://www.cnblogs.com/bo-tao/archive/2012/02/29/2374602.html

  4. Hdu2660 Accepted Necklace【简单dfs】

    http://acm.hdu.edu.cn/showproblem.php?pid=2660 题目大意:n个珠子里面找k个珠子,使得价值最大但重量不超过某一限定值. 直接对要不要第i颗珠子进行dfs, ...

  5. (step4.3.6)hdu 2660(Accepted Necklace)

    题目大意:输入三个整数t,n,k,分别表示测试用例数.宝石的种类数以及母亲所能接受的最大的重量.接下来的n行,每行有2个整数,分别表示每种宝石的价值及重量. 最后一行为母亲所能接受的保湿的最大重量 解 ...

  6. 杭电oj题目题型分类(转)

    1001 整数求和 水题 1002 C语言实验题--两个数比较 水题 1003 1.2.3.4.5... 简单题 1004 渊子赛马 排序+贪心的方法归并 1005 Hero In Maze 广度搜索 ...

  7. HDOJ题目分类大全

    版权声明:本文为博主原创文章,欢迎转载,转载请注明本文链接! https://blog.csdn.net/qq_38238041/article/details/78178043 杭电里面有很多题目, ...

  8. HDU题目分类大全【大集合】

    基础题: 1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029.  1032.1037.1040.1048.1056.105 ...

  9. 杭电OJ题目分类(转载)

    1001 整数求和 水题 1002 C语言实验题--两个数比较 水题 1003 1.2.3.4.5... 简单题 1004 渊子赛马 排序+贪心的方法归并 1005 Hero In Maze 广度搜索 ...

最新文章

  1. Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理
  2. Delphi2010使用TImage打开jpeg图片错误的处理
  3. python百度百科api-python使用API
  4. 基于socket的线上聊天框
  5. JavaScript tips and tricks - 4
  6. [洛谷P4705]玩游戏
  7. python继承实现原理封装property
  8. 日均互动50万次 微信的营销的成功之道
  9. PHP实现的服务器端,PHP实现服务器端允许客户端ajax跨域
  10. python强行终止程序_python终止程序的方法
  11. SVN提交时出现remains in conflict错误
  12. 第十五周 项目三 归并排序算法的改进
  13. win10修改系统字体(替换OneNote中Calibri字体)
  14. 【AAD Connect】03:使用AAD Connect同步到Office365时的同步规则(AD账号同步到O365)
  15. css手机触摸屏媒体查询
  16. warning C4996的分析
  17. 优化器optimizer,BGD、SGD、MBGD、NAG、AdaGrad、Adadelta、RMSProp、Adam
  18. 为别人撑伞(深度好文)
  19. 宋鸿兵 《货币战争》风暴制造者
  20. stagefright框架(四)-Video Buffer傳輸流程 .

热门文章

  1. 报表导出HTML格式怎么转换为EXCEL,使用html导出excel时的格式问题
  2. linux fuser主机关闭,linux 下强制umount+Fuser命令详解
  3. 计算机网络fmd是什么意思,不用就亏大了!酷炫又不用花钱的Win10“黑科技”
  4. Python爬虫(一):简单小说爬取实例
  5. 1、新建基于标准固件库MDK5工程模板(STM32F103ZET6)
  6. AI回合制游戏,过程比较简单。程序中的f变量和条件语句用的很经典。
  7. hardware - cortex-A15, cortex-A35,cortex-A53,cortex-A72
  8. 看不懂Offer上的岗位?这一篇统统给你说明白!
  9. fock join 列子
  10. 软考各级别各科目考试分析