转载请注明出处__谢谢! http://blog.csdn.net/huiyuan_ai?viewmode=contents by---huiyuan_ai第一次写这个东东,不好的地方还请提出,另求认识大神(ˇ^ˇ),目前只会水题- -#~~~!
题目链接:http://poj.org/problem?id=3260
这个题目,TLE的做法- -#~~~!完全背包+多重背包
#include <stdio.h>
#define inf 1000000000
int c[150],w[150];
int min(int a,int b){return a<b?a:b;}
int dp[11015];
void zero(int x,int y){
for(int j=10000;j>=x;j--)dp[j]=min(dp[j],dp[j-x]+y);
}
int main(){
int i,j,n,s,k;
while(~scanf("%d%d",&n,&s)){
for(i=0;i<=10000;i++)dp[i]=inf;
dp[0]=0;
for(i=1;i<=n;i++)scanf("%d",&w[i]);
for(i=1;i<=n;i++)scanf("%d",&c[i]);
for(i=1;i<=n;i++)
for(j=0;j<=c[i];j++)
zero(w[i],1);
for(i=1;i<=n;i++)
for(j=10000-w[i];j>=0;j--)
dp[j]=dp[j]<dp[j+w[i]]+1?dp[j]:dp[j+w[i]]+1;
printf("%d\n",(dp[s]!=inf)?dp[s]:-1);
}
}