USACO 3.1.6 Stamps (可重背包)

USACO 3.1.6 Stamps (可重背包)

其实类似可重背包问题,   f[i] = min {f[i-cost[j]] + 1}  

i表示背包容量,

cost[j]表示 第j种物品的消耗.

/**/ /*
ID: lorelei
TASK: stamps
LANG: C++
*/


#include 
< fstream >

using   namespace  std;

const   int  MAXF  =   2000000 ;
const   int  MAXN  =   55 ;
const   int  INF  =   0x7FFFFFFF ;

int  f[MAXF], cost[MAXN];
int  N, K;

int  main() {
    
int i,j;

    ifstream fin(
"stamps.in");
    ofstream fout(
"stamps.out");

    fin
>>K>>N;

    f[
0= 0 ;

    
for(i=1; i<MAXF; ++i)
        f[i] 
= INF;

    
for(i=1; i<=N; ++i)
        fin
>>cost[i];

    
for(j=1; j<MAXF; ++j){
        
for(i=1; i<=N; ++i){
            
if(cost[i]<=&& f[j-cost[i]]+1 < f[j])
                f[j] 
= f[j-cost[i]]+1;
        }

        
if(f[j]>K){
            fout
<<j-1<<endl;
            
break;
        }

    }

    
    
return 0;
}


你可能感兴趣的:(USACO 3.1.6 Stamps (可重背包))