HDU 2546 饭卡(01背包)
这道题是一道关于01背包的,需要注意的是,先排序把价钱最大的那道菜去出来不进行放入,然后在(m-5)块钱的余额下进行01背包的排序。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define inf 0x3ffffffff int n,m; int a[1005]; int dp[1005]; int DP() { memset(dp,0,sizeof(dp)); for(int i=0; i<n-1; i++) { for(int j=m-5; j>=a[i]; j--) { //printf("%d ",dp[j-a[i]]); dp[j]=max(dp[j],dp[j-a[i]]+a[i]); //printf("%d ",dp[j]); } //printf("\n"); } int ma=0; for(int i=0; i<=m; i++) if(dp[i]>ma) ma=dp[i]; return ma; } int main() { //freopen("test.txt","r",stdin); while(scanf("%d",&n),n) { for(int i=0; i<n; i++) scanf("%d",&a[i]); scanf("%d",&m); sort(a,a+n); if(m<5) printf("%d\n",m); else{ int ans=DP(); printf("%d\n",m-ans-a[n-1]); } } return 0; }