zoukankan      html  css  js  c++  java
  • 01背包变形

    电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。 
    某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。

    Input多组数据。对于每组数据: 
    第一行为正整数n,表示菜的数量。n<=1000。 
    第二行包括n个正整数,表示每种菜的价格。价格不超过50。 
    第三行包括一个正整数m,表示卡上的余额。m<=1000。 

    n=0表示数据结束。 
    Output对于每组输入,输出一行,包含一个整数,表示卡上可能的最小余额。Sample Input

    1
    50
    5
    10
    1 2 3 2 1 1 2 3 2 1
    50
    0

    Sample Output

    -45
    32


    这题主要是求出能组成最解决m-5的数值就行。
     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <string.h>
     4 #include <algorithm>
     5 using namespace std;
     6 int v[1010];
     7 int dp[1010];
     8 int main(){
     9     int n,m,p;
    10     while(scanf("%d",&n)&&n){
    11         for(int i = 0; i < n; i ++)scanf("%d",&v[i]);
    12         scanf("%d",&m);
    13         sort(v,v+n);
    14         for(int i = 0; i < n-1; i ++){
    15             for(int k = m-5; k >= v[i]; k--){
    16                 dp[k] = max(dp[k],dp[k-v[i]]+v[i]);
    17             }
    18         }
    19         if(m < 5)printf("%d
    ",m);
    20         else printf("%d
    ",m-dp[m-5]-v[n-1]);
    21         memset(dp,0,sizeof(dp));
    22         memset(v,0,sizeof(v));
    23     }
    24     return 0;
    25 }
  • 相关阅读:
    设计模式学习总结系列应用实例
    【研究课题】高校特殊学生的发现及培养机制研究
    Linux下Oracle11G RAC报错:在安装oracle软件时报file not found一例
    python pro practice
    openstack python sdk list tenants get token get servers
    openstack api
    python
    git for windows
    openstack api users list get token get servers
    linux 流量监控
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/7192912.html
Copyright © 2011-2022 走看看