HDU-2546 01背包问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546
题意:这其实就是一个简单地01背包问题
关于01背包:
有N件物品和一个容量为V的背包。第i件物品的体积是v[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。
每个物品只能往背包中装最多一次的操作;
注意:因为这个题要求我们要使最后的饭卡的钱最小,我们不妨先进行以下排序,然后把前n-1个物品先放入背包中,最后再用剩下的钱减去那个价钱最高的菜,就是 最后最小的金钱数
代码:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int a[2000];
int dp[2000];
int main(){
int n,val;
while(scanf("%d",&n)!=EOF){
if(n==0)
break;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
//这里进行了以下排序,结合“注意”可知道意图
scanf("%d",&val);
memset(dp,0,sizeof(dp));
if(val<5)
printf("%d\n",val);
//根据题意如果金钱小于5,那么我们不能够购买任何东西,即使钱是够的
else{
int m=val-5;
for(int i=1;i<=n-1;i++){
for(int j=m;j>=a[i];j--){
dp[j]=max(dp[j-a[i]]+a[i],dp[j]);
}
}
//上面是进行01滚动时的过程,因为本题没有体积这个项,根据题意可知,就是每个钱的价钱,即为体积;
printf("%d\n",val-dp[m]-a[n]);
}
}
return 0;
}