标签:dp
刚开始想到的方法复杂度很大,抱着试一试的心态提交了,果然TLE了
然后搜了搜,是个完全背包,好多都不记得了,重新复习了一下。
第一个注释的解法是TLE的,第二个和第三个都是可行的,但思路不同。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int inf=0x7fffffff;
#define N 10005
int 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_JUDGE
freopen("in.txt","r",stdin);
#endif
int 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;
}标签:dp
原文地址:http://blog.csdn.net/lj94093/article/details/45287313