Drink
Accepts: 1896
Submissions: 4596
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
Problem Description
我们有 nnn 种不同的饮料,每种饮料有无限多瓶,第 iii 种饮料一瓶提供 x[i]x[i]x[i] 毫升的水分,包含 y[i]y[i]y[i] 卡路里。
现在我们需要选择一种饮料一直喝,直到补充了至少 mmm 毫升的水分,我们想使得摄入的卡路里总和最小。请求出这个最小值。
一旦打开一瓶饮料,就一定要喝完。
Input
第一行一个整数 test(1≤test≤100)test(1 \le test \le 100)test(1≤test≤100) 表示数据组数。
对于每组数据,第一行两个整数 n,m(1≤n≤100,1≤m≤10000)n, m(1 \le n \le 100, 1 \le m \le 10000)n,m(1≤n≤100,1≤m≤10000)。
接下来 nnn 行,每行两个整数 x[i],yix[i], y[i](1 \le x[i], y[i] \le 100)x[i],yi。
Output
对于每组数据,一行一个整数表示答案。
Sample Input
2
1 10
3 3
2 10
3 3
2 1
Sample Output
12
5
吐了没看清题,以为是完全背包
交了N遍的错误代码
#include <stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
long long dp[20110];
int x[101],y[101];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int i,m,n,j;
scanf("%d%d",&n,&m);
memset(dp,INF,sizeof(dp));
for(i=1;i<=n;i++)
scanf("%d%d",&x[i],&y[i]);
dp[0]=0;
for(i=1;i<=n;i++)
{
for(j=x[i];j<=m+10000;j++)
dp[j]=min(dp[j],dp[j-x[i]]+y[i]);
}
sort(dp+m,dp+m+10000);
printf("%lld\n",dp[m]);
}
return 0;
}
学姐给我发的正确代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define sc(T) scanf("%d",&T)
#define scc(x,y) scanf("%d %d",&x,&y)
#define pr(T) printf("%d\n",T)
#define inf 0x3f3f3f3f
int main()
{
int T;
sc(T);
while(T--)
{
int n,m,mi=inf;
scc(n,m);
for(int i=1; i<=n; i++)
{
int x,y;
scc(x,y);
int k=m/x;
if(m%x!=0)
k++;
mi=min(mi,k*y);
}
pr(mi);
}
return 0;
}