據說是dp裏的東西,據說就是每樣東西只有一個,據說就是最優解嘛~~
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
1 | 0 | 0 | 0 | 0 | 0 | 10 | 10 | 10 | 10 | 10 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
2 | 0 | 0 | 0 | 0 | 5 | 10 | 10 | 10 | 10 | 10 |
1 | 0 | 0 | 0 | 0 | 0 | 10 | 10 | 10 | 10 | 10 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
dp[3][1]=0,dp[3][2]=0,dp[3][3]=0
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
3 | 0 | 0 | 0 | 13 | 13 | 13 | 13 | 13 | 18 | 23 |
2 | 0 | 0 | 0 | 0 | 5 | 10 | 10 | 10 | 10 | 10 |
1 | 0 | 0 | 0 | 0 | 0 | 10 | 10 | 10 | 10 | 10 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
4 | 0 | 0 | 11 | 13 | 13 | 13 | 24 | 24 | 24 | 24 |
3 | 0 | 0 | 0 | 13 | 13 | 13 | 13 | 13 | 18 | 13 |
2 | 0 | 0 | 0 | 0 | 5 | 10 | 10 | 10 | 10 | 10 |
1 | 0 | 0 | 0 | 0 | 0 | 10 | 10 | 10 | 10 | 10 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int main()
{
int c,n,i,j;
int v[100],w[100],dp[100][100];
scanf("%d%d",&c,&n);
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
for(i=1;i<=n;i++)
scanf("%d",&w[i]);
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
for(j=1;j<=c;j++)
{
if(j>=v[i])
{
if((dp[i-1][j-v[i]]+w[i])>dp[i-1][j])
dp[i][j]=dp[i-1][j-v[i]]+w[i];
else
dp[i][j]=dp[i-1][j];
}
else
dp[i][j]=dp[i-1][j];
}
printf("%d",dp[n][c]);
return 0;
}
我以爲結束了,這時巨巨們又說話了其實這個可以用滾動數組來存放Σ(っ°Д°;)っ,萌新第一次聽說,但巨巨們說了,那╮(╯﹏╰)╭
滾動數組,看起來就是把上面那一坨呆碼裏的二維數組換成一維數組,節約了空間!!!
但是,我們之前之所以用二維數組,原因是使每樣物品只放一次,那換成一維數組爲防止這個問題,放置時的順序在表格中就要從右向左的順序
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int main()
{
int v[100],w[100],dp[100],n,i,j;
int c;
scanf("%d%d",&c,&n);
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
for(i=1;i<=n;i++)
scanf("%d",&w[i]);
for(i=1;i<=n;i++)
{
for(j=c;j>=0;j--)
{
if(j>=v[i])
{
if(dp[j-v[i]]+w[i]>dp[j])
dp[j]=dp[j-v[i]]+w[i];
}
}
}
printf("%d\n",dp[c]);
return 0;
}
以上全部用的c語言,c++真的還沒學會呢╥﹏╥真的是萌新
第一次寫,如有問題,望指正!!!(´・ᴗ・`)