首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

poj 1742 Coins 多重双肩包变形

2013-09-05 
poj 1742 Coins 多重背包变形题目:http://poj.org/problem?id1742用bool dp[i]来表示价i是否能被表示出。

poj 1742 Coins 多重背包变形

题目:http://poj.org/problem?id=1742

用bool dp[i]来表示价格i是否能被表示出。

直接做:

#include <cstdio>#include <iostream>using namespace std;const int max_s = 107;bool f[100007];int w[max_s],b[max_s];//f[i]来表示当前i价格是否出现过,int sum[100007];//当价格达到i时,最多使用这一种硬币的次数int main(){    int n,V,i,j;    while(scanf("%d%d",&n,&V),n+V)    {        int ans=0;        for(i=0;i<n;i++)        scanf("%d",&w[i]);        for(i=0;i<n;i++)        scanf("%d",&b[i]);        for(i=f[0]=1;i<=V;i++) f[i]=0;                for(i=0;i<n;i++)        {            for(j=0;j<=V;j++) sum[j]=0;//关键是用sum来限定了次数            for(j=w[i];j<=V;j++)//从w[i]到V循环检查看是否能够出现前边没有出现的价格            {                if(!f[j]&&f[j-w[i]]&&sum[j-w[i]]<b[i])                //如果j价格没有出现过,且j-w[i]出现过,并且使用i硬币的次数没有超出给定的数量                {                    f[j]=1;//标记为已出现过                    sum[j]=sum[j-w[i]]+1;//使用次数+1                    ans++;                }            }        }        cout<<ans<<endl;    }}


热点排行