输入
多个样例测试,第一行给定n和m,分别代表物品种类数和下限重量。
接下来的n行分别给定p和c,分别代表价值和重量,以空格分开。
输出
求购得m重量物品的最小价值b,每个测试样例输出一行:所需价值b和购得的重量,以空格分开
示例输入
3 3
2 1
3 1
1 1
3 5
2 3
1 2
3 3
示例输出
3 3
3 6
解决思路
“完全背包问题”加“多重部分和(即枚举)”问题,这里不再赘述,参考文章点击这里
AC代码
#include<stdio.h>
#include<string.h>
const int maxn = 1019;
typedef long long int ll;
ll mark[10019],w[maxn],v[maxn];
ll n,m;
inline ll min(ll a,ll b){
if(a>b)return b;
return a;
}
int main(){
ll a,b;
ll INF;
while(scanf("%lld%lld",&n,&m)!=EOF){
a = b = 0;
memset(mark,63,sizeof(mark));
INF = mark[10];
for(int i = 0;i<n;++i)
scanf("%lld%lld",&v[i],&w[i]);
mark[0]=0;
for(int i = 0;i<n;++i)
for(int j = w[i];j<=10000;++j){
if(mark[j-w[i]]<INF)
mark[j] = min(mark[j],mark[j-w[i]]+v[i]);
// printf("mark[%d]:%llu\n",j,mark[j]);
}
b = INF;
for(int i = m;i<=10000;++i){
if(mark[i]<=b){
b = mark[i];
a = i;
}
}
printf("%lld %lld\n",b,a);
}
return 0;
}