题意:买矿泉水,给你个n(水的种类)和m,求矿泉水的重量不小于m的最小花费
思路: 完全背包加枚举,dp[i] 表示水的重量为i的最小花费,求出所有的dp[i] ( 1<=i<=1e4) ,再从m开始更新答案即可。
代码:
#include<iostream>
#include<map>
#include<iomanip>
#include<algorithm>
#include<math.h>
#include<memory.h>
#include<string>
#include<string.h>
#include<cstdio>
typedef long long ll;
using namespace std;
const int maxn=5e4+5;
const int inf=0x3f3f3f3f;
int w[1005], v[1005];
int dp[maxn];
int main()
{
int n, m, a, b;
while(~scanf("%d%d", &n, &m))
{
for(int i=0; i<n; i++)
{
scanf("%d%d", &v[i], &w[i]);
}
memset(dp, inf, sizeof(dp));
dp[0]=0;
for (int i=0; i<n; i++)
{
for (int j=w[i]; j<=1e4+5; j++)
{
dp[j]=min(dp[j], dp[j - w[i]] + v[i]);
}
}
a=inf;
b=0;
for (int i=m; i<=1e4; i++)
{
if (dp[i]<=a)
{
a=dp[i];
b=i;
}
}
printf("%d %d\n",a,b);
}
return 0;
}