HDU 1114 Piggy-Bank

来源:互联网 发布:java 泛型类 静态方法 编辑:程序博客网 时间:2024/06/18 18:34

刚开始想到的方法复杂度很大,抱着试一试的心态提交了,果然TLE了

然后搜了搜,是个完全背包,好多都不记得了,重新复习了一下。

第一个注释的解法是TLE的,第二个和第三个都是可行的,但思路不同。

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int inf=0x7fffffff;#define N 10005int dp[N],p[505],w[505];void init(){//memset(dp,-1,sizeof(dp));for(int i=0;i<N;i++) dp[i]=inf;dp[0]=0;}int main(){#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);#endifint T,n,e,f;scanf("%d",&T);while(T--){init();scanf("%d%d%d",&e,&f,&n);for(int i=1;i<=n;i++) scanf("%d%d",&p[i],&w[i]);/*for(int i=1;i<=f-e;i++){//这个方法直接从n的规模开始考虑,明显没有用到dp的优点 for(int j=1;j<=n;j++){for(int k=0;k*w[j]<=i;k++){if(dp[i-k*w[j]]!=inf) dp[i]=min(dp[i],dp[i-k*w[j]]+p[j]*k);}}}*//*for(int i=1;i<=n;i++){//从前i-1种推至前i种 for(int j=w[i];j<=f-e;j++){if(dp[j-w[i]]!=inf) dp[j]=min(dp[j],dp[j-w[i]]+p[i]);}}*/for(int i=1;i<=f-e;i++) {//重量为i时,n种物品能到达的最小值,在这里不用考虑第j种物品的数量,因为i是从小到大的,那么我们每次计算的时候都自动沿用数量为k-1个的值 for(int j=1;j<=n;j++){if(i-w[j]>=0&&dp[i-w[j]]!=inf) dp[i]=min(dp[i],dp[i-w[j]]+p[j]);}}if(dp[f-e]==inf) printf("This is impossible.\n");else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[f-e]);}return 0;}


0 0