0)
1)多重背包 【注意,使用number数组存储 第i个物品在当前背包装入总金额为j的情况下 使用的个数,从而用更大的空间开销换取更快的时间,AC代码和超时代码分别如下:】
AC:
#include <iostream>
#include <string.h>
#include <algorithm>
//找零钱问题==多重背包(每种面值有数量限制)
using namespace std;
const int MAXN=100010;
int cash;
int n;
int res;
int dp[MAXN];
int number[MAXN];
struct Specie{
int num;//每种数量
int deno;//每种面额
}species[12];
int cmp(struct Specie s1,struct Specie s2){
return s1.deno<s2.deno;
}
int main()
{
while(cin>>cash>>n){
res=0;
memset(species,0,sizeof(species));
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++){
cin>>species[i].num>>species[i].deno;
}
for(int i=0;i<n;i++){
memset(number,0,sizeof(number));
for(int j=species[i].deno;j<=cash;j++){
if(dp[j]<dp[j-species[i].deno]+species[i].deno&&number[j-species[i].deno]+1<=species[i].num){
dp[j]=dp[j-species[i].deno]+species[i].deno;
number[j]=number[j-species[i].deno]+1;
}
}
}
cout<<dp[cash]<<endl;
}
return 0;
}
Time Limit Exceeded:
#include <iostream>
#include <string.h>
#include <algorithm>
//找零钱问题==多重背包(每种面值有数量限制)
using namespace std;
const int MAXN=100010;
int cash;
int n;
int res;
int dp[MAXN];
struct Specie{
int num;//每种数量
int deno;//每种面额
}species[12];
int cmp(struct Specie s1,struct Specie s2){
return s1.deno<s2.deno;
}
int main()
{
while(cin>>cash>>n){
res=0;
memset(species,0,sizeof(species));
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++){
cin>>species[i].num>>species[i].deno;
}
for(int i=0;i<n;i++){
int minn=min(species[i].num,cash/species[i].deno);
for(int k=1;k<=minn;k++){
for(int j=cash;j>=species[i].deno;j--){
dp[j]=max(dp[j],dp[j-species[i].deno]+species[i].deno);
}
}
}
cout<<dp[cash]<<endl;
}
return 0;
}