原先用的滚动数组,现在用基本的动态规划,结果调试了很多次,发现了原因,贴上改正后的代码:
1 #include2 #include 3 int v[1005],c[1005]; 4 int f[1005][1005]; 5 int max(int a,int b){ 6 if(a>b) return a; 7 return b; 8 } 9 int main()10 {11 int i,j,n,C;12 while(scanf("%d%d",&n,&C),n||C){13 memset(f,0,sizeof(f));14 for(i=1;i<=n;i++)15 scanf("%d%d",&c[i],&v[i]);16 for(i=1;i<=n;i++)17 for(j=0;j<=C;j++){ //也可以改为j从C到018 f[i][j]=f[i-1][j]; //忘记了当 j =c[i])21 f[i][j]=max(f[i-1][j-c[i]]+v[i],f[i-1][j]);22 }23 printf("%d\n",f[n][C]);24 }25 return 0;26 }
滚动数组解法:
#includeint main(){ int i,j,n,v,c,w; while(scanf("%d%d",&n,&v)&&n||v) { int price[1001]={}; for(i=0;i =c;j--) //滚动数组j必须从大到小递推 , //之所以这样是因为本次的 price[j] 需要从前一次的 price[j]得到 if(price[j]