Buying Apples!

Buying Apples!

 

Harish went to a supermarket to buy exactly ‘k’ kilograms apples for his ‘n’ friends. The supermarket was really weird. The pricing of items was very different. He went to the Apples section and enquired about the prices. The salesman gave him a card in which he found that the prices of apples were not per kg. The apples were packed into covers, each containing ‘x’ kg of apples, x > 0 and ‘x’ is an integer. An ‘x’ kg packet would be valued at ‘y’ rupees. So, the placard contained a table with an entry ‘y’ denoting the price of an ‘x’ kg packet. If ‘y’ is -1 it means that the corresponding packet is not available. Now as apples are available only in packets, he decides to buy atmost ‘n’ packets for his ‘n’ friends i.e he will not buy more than n packets of apples.

Harish likes his friends a lot and so he does not want to disappoint his friends. So now, he will tell you how many friends he has and you have to tell him the minimum amount of money he has to spend for his friends.

Input

The first line of input will contain the number of test cases, C.

Each test case will contain two lines.

The first line containing N and K, the number of friends he has and the amount of Apples in kilograms which he should buy.

The second line contains K space separated integers in which the ith integer specifies the price of a ‘i’kg apple packet. A value of -1 denotes that the corresponding packet is unavailable.

  • 0 < N <= 100
  • 0 < K <= 100
  • 0 < price <= 1000

Output

The output for each test case should be a single line containing the minimum amount of money he has to spend for his friends. Print -1 if it is not possible for him to satisfy his friends.

Sample I/O

Input:
2
3 5
-1 -1 4 5 -1
5 5
1 2 3 4 5

Output:
-1
5

Explanation of test cases:

1) As there are only 3 and 4kg packets in the shop, he will not be able to satisfy his friends as he would not be able to buy exactly 5kg of apples.

2) He can buy five 1kg packet as he has to buy 5 kg. So the min money he should spend is 5.

【分析】完全背包

有N个朋友,要买k千克苹果,超市里有1~k千克的苹果,各a[i]元,问能否买到k千克的苹果,所花的钱最少,并且不超过N件(然而N没用。。。)。



#include <iostream>
#include <cstdio>#include <cmath>#include <cstring>using namespace std;#define cl(a,b) memset(a,b,sizeof a);const int maxn = 5051;const int INF = 0x3f3f3f3f;int a[101];int dp[maxn];int num[maxn];int main(){ int t; scanf("%d",&t); while(t--){ int n,m; for(int i=0;i<maxn;i++) dp[i] = INF; cl(num,0); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d",a+i); if(a[i]!=-1){ dp[i] = a[i]; num[i] = 1; } } for(int i=1;i<=m;i++){ if(a[i]!=-1) for(int j=0;j<m;j++){ if(dp[j]!=INF){ if(dp[i+j] > dp[j]+a[i]&&num[j]+1<=n){ dp[i+j] = dp[j] + a[i]; num[i+j] = num[j] + 1; } } } } if(dp[m]==INF) dp[m] = -1; printf("%d\n",dp[m]); } return 0;}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值