选课时间(题目已修改,注意读题)

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4478    Accepted Submission(s): 3480

Problem Description
又到了选课的时间了,xhd看着选课表发呆,为了想让下一学期好过点,他想知道学n个学分共有多少组合。你来帮帮他吧。(xhd认为一样学分的课没区别)
 
Input
输入数据的第一行是一个数据T,表示有T组数据。
每组数据的第一行是两个整数n(1 <= n <= 40),k(1 <= k <= 8)。
接着有k行,每行有两个整数a(1 <= a <= 8),b(1 <= b <= 10),表示学分为a的课有b门。
 
Output
对于每组输入数据,输出一个整数,表示学n个学分的组合数。
 
Sample Input
2
2 2
1 2
2 1
40 8
1 1
2 2
3 2
4 2
5 8
6 9
7 6
8 8
 
Sample Output
2
445
 
最开始用多重背包做,发现二进制优化多出的零头可能发生重复,但是没相处解决方案。
看题解用的01背包,稍作修改避免了重复。
因为数据规模小,用dfs也很方便。
 
01背包:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; int cost[],num[],dp[],n; void zero_one(int cost,int num)
{
for(int j=n;j>=cost;j--)
for(int k=;k<=num&&j-k*cost>=;k++)
dp[j]+=dp[j-cost*k];
} int main()
{
int t,k;
scanf("%d",&t);
while(t--)
{
memset(dp,,sizeof(dp));
dp[]=;
scanf("%d%d",&n,&k);
for(int i=;i<k;i++)
{
scanf("%d%d",&cost[i],&num[i]);
if(cost[i]*num[i]>n)
num[i]=n/cost[i];
//dp[cost[i]]=1;
}
for(int i=;i<k;i++)
{
zero_one(cost[i],num[i]);
}
printf("%d\n",dp[n]);
}
return ;
}
dfs:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; int cost[],num[],res,n,k; void dfs(int index,int sum)
{
if(index>k||sum>n)
return;
if(index==k&&sum!=n)
return;
if(sum==n)
{
res++;
return;
}
for(int i=;i<=num[index];i++)
{
dfs(index+,sum+i*cost[index]);
}
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
res=;
scanf("%d%d",&n,&k);
for(int i=;i<k;i++)
scanf("%d%d",&cost[i],&num[i]);
dfs(,);
printf("%d\n",res);
}
return ;
}

最新文章

  1. [java] 找出字符串中出现最多的字符和出现的次数
  2. HomeKit 与老旧设备
  3. hdu 4055 递推
  4. 使用python selenium进行自动化functional test
  5. 关于Object[]数组强转成Integer[]类型的数组.
  6. SQL、LINQ、Lambda 三种用法
  7. linux系统中的删除操作
  8. Java 执行CMD/DOS
  9. iOS进阶之使用 NSURLProtocol 拦截 HTTP 请求(转载)
  10. 【C++】C++中的string类的用法总结
  11. The process could not read file xxx due to OS error 53
  12. PowerMock单元测试踩坑与总结
  13. python程序打包成.exe
  14. layer.js 中弹框显示不全的问题
  15. Windows 7中200M神秘隐藏分区
  16. json.dumps(),json.loads(),json.dump(),json.load()方法的区别
  17. [CERC2017]Intrinsic Interval[scc+线段树优化建图]
  18. python命名空间与闭包函数详解
  19. [na]tcpdump非常实用的抓包实例
  20. android 系统广播

热门文章

  1. WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍
  2. C++获取时间的方法
  3. eventkeyboardmouse
  4. Dinic(模板 再错是不可能的 这辈子都不可能了)
  5. [Codeforces 496E] Distributing Parts
  6. EasyUI Datagrid 分页显示(客户端)
  7. 牛客网NOIP赛前集训营 提高组(第七场)
  8. Hadoop回收站及fs.trash参数详解
  9. python自动化测试学习笔记-8单元测试unittest模块
  10. ASP.Net 知识点总结(四)