题目http://acm.hdu.edu.cn/showproblem.php?pid=2126

分析:有两个要求,一是计算最多可以选多少中纪念品;而是计算选最多纪念品的方案有多少种,
即统计最优方案的个数。dp[j][k]等价于dp[i][j][k]表示在前i个物品中选取j个纪念品花费为k的方案数。

 dp[j][k]=dp[j][k]+dp[j-1][k-c[i]]

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

int n,m,p[35],dp[35][510];

void ZeroOnePack()
{
  memset(dp,0,sizeof(dp));
  dp[0][0]=1;

  for(int i=1;i<=n;i++)
    for(int j=n;j>=1;j--)
      for(int k=m;k>=p[i];k--)
        dp[j][k]+=dp[j-1][k-p[i]];

  int ans;
  for(int j=n;j>=1;j--)
  {
    ans=0;
    for(int k=m;k>=0;k--)
      ans+=dp[j][k];
    if(ans){
      printf("You have %d selection(s) to buy with %d kind(s) of souvenirs.\n",ans,j);
      return;
    }
  }
  printf("Sorry, you can't buy anything.\n");
}

int main()
{
  int t;
  scanf("%d",&t);
  while (t--)
  {
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
      scanf("%d",&p[i]);

    ZeroOnePack();
  }
  return 0;
}


最新文章

  1. [css3]叉叉旋转效果
  2. There was an internal API error.的解决办法
  3. python---生成随机密码
  4. android之数据库SQLite(一)
  5. C++11 常用语法
  6. jsp页面用el表达式获取枚举的code
  7. python2 dir(list)
  8. Linux同步时间命令ntpdate
  9. C++ 多态性浅谈
  10. Android利用canvas画画板
  11. for循环 + setTimeout 结合的烂大街的面试题
  12. java http缓存
  13. Web 前台优化
  14. 奖品列表组件【仿swiper】
  15. vue强制刷新组件
  16. 排序算法之选择排序的思想以及Java实现
  17. 11.11luffycity(5)
  18. python遇到的文件错误
  19. Hadoop-2.8.0分布式安装手册
  20. 深入理解Java反射+动态代理

热门文章

  1. 使用mapreduce对日志进行清洗
  2. Tesseract&amp;tesseractOCRiOS
  3. Hadoop和Spark的统一部署
  4. Qt Creator编译时提示找不到“ui_xxx.h”文件
  5. C# 调用 C#DLL
  6. Windows start
  7. 模拟MySQL命令
  8. fiddler过滤其他网站请求
  9. MongoDB错误记录
  10. STM32F4X 关于MDK上虚拟串口调试