M的整数倍
来源:互联网 发布:淘宝 同一时间下单人数 编辑:程序博客网 时间:2024/04/30 04:41
M的整数倍
Time Limit: 1 Sec Memory Limit:128 MBSubmit: 42 Solved: 12
[Submit][Status][Discuss]
Description
给定N个数,选出任意多的数(每个数只能选一次),使其和为M的整数倍。问最少需要选几个数
Input
第一行输入一个数T代表测试用例组数(T<=10),接下来T组测试用例,每组测试用例第一行为整数M, N(1<=M, N<=1000);接下来N行每行一个数,分别代表N个数之一。
Output
对于每组测试用例,输出满足条件最少需要选几个数,若没有解输出-1。每行输出一个结果。
Sample Input
24 31112 224
Sample Output
-11
思路:动态规划
<span style="font-size:18px;">#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int MN=5000000; const int INF=0x7fffffff; int num[1100]; int dp[MN]; int ans; int sum; int n,m; int MIN(int a,int b) { return a<b?a:b; } bool cmp(int a,int b) { return a<b; } int main() { int T,i,j; scanf("%d",&T); while(T--) { scanf("%d%d",&m,&n); int sum=0; for(i=0; i<n; i++) { scanf("%d",&num[i]); sum+=num[i]; } sort(num,num+n,cmp); int ans=INF; int t=sum/m; int cas=1; while(cas<=t) { if(ans!=INF) break; if(cas*m>sum) break; for(i=1;i<=cas*m;i++) dp[i]=INF-100; dp[0]=0; for(i=0; i<n; i++) { for(j=cas*m; j>=num[i]; j--) { dp[j]=MIN(dp[j],dp[j-num[i]]+1); } if(dp[cas*m]<ans) ans=dp[cas*m]; } cas++; } if(ans==INF) printf("-1\n"); else printf("%d\n",ans); } return 0; } </span>
0 0
- M的整数倍
- 13、字体的整数倍放大
- [数字图像处理]数字图像的整数倍缩小
- 一个时间粒度整数倍的时间点
- 0.5的整数倍(任何位数)
- 以为整数倍
- 原来分片长度必须是8的整数倍
- 算法 - 快速求一个整数的7倍
- [数字图像处理]数字图像的整数倍扩大(数字图像插值)
- 大整数的m进制转n进制
- 产生[n,m]之间的随机整数
- HDU4507 不要整数中 某一位是7 每一位加起来的和是7的整数倍 或是7的整数倍
- C语言 - 判断整数倍
- 已知一个整数N,求另外一个整数M,使得M本身 + M各个位上的数 = N
- 一个简单的取就近的五分钟的整数倍的日期
- 求大A并且最接近A的B的整数倍
- 写IRP返回的长度可能不是sectorsize的整数倍
- ios oc 判断输入的数是否是另一个的整数倍
- DFT补零的影响
- Qt Mode/View 学习笔记 —— 概述和Model
- 一点心得
- 古文保护一二事
- spring4mvc 实现文件下载功能reponse.getOutputStream()重复调用问题解决
- M的整数倍
- Android之复杂数据的AIDL Service
- Linux虚拟内存实现原理
- 在主函数中输入10个等长的字符串。用另一个函数对它们排序,然后主函数输出10个已经排好的字符串
- Java23设计模式详解
- 栈的操作-C++
- 如何改变生活
- js+css打造的仿土豆网带缩略图的图片幻灯切换效果
- 关于文件上传大小限制和自定义ALERT弹出框案例