题目描述
给你n个钱币,每个钱币不仅有面值,还有重量,问最少多重的钱币可以恰好使得钱数为S?
(看起来题目字特别少是不……)
输入格式
第一行:2个整数n,s,范围在[1 100];
第二行:n个整数表示钱币相应的面值,每个数范围在[1, 100];
第三行:n个整数钱币相应的重量,每个数范围在[1, 10000]。
输出格式
最少重量。(如果没有方案输出-1)
输入/输出样例1
输入:
6 8
3 2 3 7 2 1
5 3 5 13 3 1
输出:
12
样例解释
8=3+2+2+1,重量=5+3+3+1=12。
分析
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,s;
int a[1000000+10],b[1000000+10],f[1000000+10];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
memset(f,0x3f,sizeof(f));
f[0]=0;
for(int i=1;i<=n;i++)
{
for(int j=m;j>=a[i];j--)
{
f[j]=min(f[j],f[j-a[i]]+b[i]);
}
}
if(f[m]==0x3f)cout<<-1;
else cout<<f[m];
return 0;
}