动态规划7:砝码和种类优化成01背包问题

来源:互联网 发布:java socket编程实例 编辑:程序博客网 时间:2024/04/29 18:40

动态规划入门7

分类:算法与数据结构

 

例题6

 

砝码称重

 

来源:NOIP1996(提高组)  第四题

 

【问题描述】

 

    设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),用他们能称出的重量的种类数。

 

【输入文件】

 

 a1  a2  a3 a4  a5  a6

 

    (表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个,中间有空格)。

 

【输出文件】

 

 Total=N

 

    (N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)。

 

【输入样例】

 

    11 0 0 0 0

 

【输出样例】

 

   TOTAL=3

 

【问题分析】

 

把问题稍做一个改动,已知a1+a2+a3+a4+a5+a6个砝码的重量w[i], w[i]∈{ 1,2,3,5,10,20} 其中砝码重量可以相等,求用这些砝码可称出的不同重量的个数.

 

这样一改就是经典的0/1背包问题的简化版了,求解方法完全和上面说的一样,这里就不多说了,只是要注意这个题目不是求最大载重量,是统计所有的可称出的重量的个数。

CODE

//2014年9月11日15:56:52 //author:BGY #include<stdio.h>#include<climits>#include<algorithm>#include<stack>#include<iostream>#include<cmath>#include<set>#include<vector>#include<map>#include<queue>#include<string.h>using namespace std;const int maxn=1010;bool f[maxn];typedef struct node{  int weight;  int num;}node;node a[6];int  main(void){  while(scanf("%d",&a[0].num)!=EOF)  {    if(a[0].num==-1) break;    for(int i=1;i<6;i++)    {    scanf("%d",&a[i].num); } a[0].weight=1; a[1].weight=2; a[2].weight=3; a[3].weight=5; a[4].weight=10; a[5].weight=20; memset(f,false,sizeof(f)); f[0]=true; for(int i=0;i<6;i++) {           for(int j=1000;j>=0;j--)           {             if(f[j])//代表的是有砝码可以达到这个和              {    for(int k=0;k<=a[i].num;k++){        f[j+a[i].weight*k]=true;     }      }           } } int cn=0; for(int i=1;i<=1000;i++) {    if(f[i]) cn++; } cout<<cn<<endl;     }  return 0;}

COME ON

0 0
原创粉丝点击