hdu2546-饭卡
饭卡
打啵固态思维,转换成01背包问题,学习人家dp的排版
先01背包算出用m-5元可以买到最贵的菜,然后就会一次买最贵的。
// File Name: hdu2546.cpp // Author: rudolf // Created Time: 2013年04月20日 星期六 18时51分53秒 #include<iostream> #include<algorithm> #include<string.h> using namespace std; const int maxn=1010; int dp[maxn]; int value[maxn],weight[maxn]; int nvalue,vkind; void ZeroOnePack(int cost ,int weight) { for(int i=nvalue;i>=cost;i--) dp[i]=max(dp[i],dp[i-cost]+weight); } int main() { int m,n; while(cin>>n,n) { for(int i=0;i<n;i++) { cin>>value[i]; if(value[i]>value[0]) swap(value[i],value[0]); } cin>>m; if(m<5) { cout<<m<<endl; continue; } memset(dp,0,sizeof(dp)); for(int i=1;i<n;i++) weight[i]=value[i]; nvalue=m-5; for(int i=1;i<n;i++) ZeroOnePack(value[i],weight[i]); cout<<(m-dp[nvalue]-value[0])<<endl; } return 0; }