M的整数倍

来源:互联网 发布:淘宝 同一时间下单人数 编辑:程序博客网 时间:2024/04/30 04:41

M的整数倍

Time Limit: 1 Sec  Memory Limit:128 MB
Submit: 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
原创粉丝点击