01揹包-hdu 2546 飯卡
阿新 • • 發佈:2019-02-06
思路:
把最大的那個值去掉,拿剩下的5元錢去買。
注意m<5的時候直接輸出。坑死了
#include <iostream> #include <stdio.h> #include <cstring> #include <algorithm> using namespace std; int dp[1005]; int a[1005]; int n,m; int main() { while(~scanf("%d",&n)) { if(n==0) break; memset(dp,0,sizeof(dp)); int sum=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sum+=a[i]; } scanf("%d",&m); if(m<5) { cout<<m<<endl; continue; } int use=0; int money=m; sort(a+1,a+1+n); if(a[n]>=5) { use=a[n]; money=m-5; n=n-1; } for(int i=1;i<=n;i++) { for(int voc=money;voc>=a[i];voc-- ) { dp[voc]=max(dp[voc],dp[voc-a[i]]+a[i]); } } cout<<m-use-dp[money]<<endl; } return 0; }