hdu2546饭卡

来源:互联网 发布:淘宝描述服务物流 编辑:程序博客网 时间:2024/06/03 17:37

dp[i][j]=max{dp[i-1][j],(dp[i-1][j-c[i]]+c[i])};        对于第i种菜品,剩下j元时,可消费的最大金额(买或不买第i种菜品)

用滚动数组做动态规划处理dp[j]=max(dp[j],(dp[j-c[i]]+c[i])),(j=m-5;j>=c[i];j--)当处理第i种菜品时dp[j],dp[j-c[i]]存储的数据就是dp[i-1][j],dp[i-1][j-c[i]],所以,没必要使用二维数组,可节约程序运行时的内存,每当i改变时,dp[]数组即被更新,最后答案存储在dp[m-5]中

/******************************* * Author:fisty * Data:2014-10-1 * hdu2546 * 01背包 ******************************/#include <cstdio>#include <algorithm>#include <cstring>using namespace std;#define MAX_N 1000int n,m;int a[MAX_N];int dp[MAX_N];int main(){        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);                        continue;                }                memset(dp, 0, sizeof(dp));                for(int i = 0;i < n-1; i++){                        //最大第n个的留到最后再取                        for(int j = m-5; j >= a[i];j--){                                //剩下j元时能消费的最大金额                                dp[j] = max(dp[j] , dp[j-a[i]]+a[i]);                        }                }                printf("%d\n", m - dp[m-5] - a[n-1]);        }        return 0;}


0 0