1 01背包
http://acm.hdu.edu.cn/showproblem.php?pid=2602(骨头)
http://www.cnblogs.com/javawebsoa/archive/2013/07/19/3201314.html
http://blog.csdn.net/libin56842/article/details/9338841
01背包的特点就是:每种物品仅有一件,可以选择放或不放。
#include <iostream>
#include <algorithm>
using namespace std;
int a[1005],b[1005];
int f[1005][1005];
int main()
{
int t,n,v;
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
cin>>n>>v;
int i,j;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++)
cin>>b[i];
for(i=1;i<=n;i++)//从第一个骨头呆最后一个骨头
{
for(j=0;j<=v;j++)//容器容量从0到v
{
if(j>=b[i])//如果第i个骨头可以放入剩余容量的容器中
f[i][j]=max(f[i-1][j],f[i-1][j-b[i]]+a[i]);//选择放第i个还是不放
else//如果放不了则只要前i-1个的最大价值
f[i][j]=f[i-1][j];
}
}
cout<<f[n][v]<<endl;
}
}
}
#include <iostream>
#include <algorithm>
using namespace std;
int a[1005],b[1005];
int main()
{
int t;
int dp[1005];
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
int n,v,i,j;
cin>>n>>v;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++)
cin>>b[i];
memset(dp,0,sizeof(dp));//注意及时清0
for(i=1;i<=n;i++)
{
for(j=v;j>=b[i];j--)
{
dp[j]=max(dp[j],dp[j-b[i]]+a[i]);
}
}
cout<<dp[v]<<endl;
}
}
}
http://acm.hdu.edu.cn/showproblem.php?pid=2546(饭卡余额)
#include <iostream>
#include <algorithm>
using namespace std;
int cmp(int a,int b)
{
return a<b;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
int m,i,j;
int b[1005]={0};
int dp[1005]={0};
for(i=1;i<=n;i++)
cin>>b[i];
sort(b+1,b+1+n,cmp);//从下到大排序
int MAX=b[n];//max等于最大的一个
cin>>m;
if(m>=5)
{
m=m-5;//花5元卖最贵的菜
for(i=1;i<n;i++)//注意这里不等于n这里的n是最贵的菜,m-5就已经买过一次了
{
for(j=m;j>=b[i];j--)
{
dp[j]=max(dp[j],dp[j-b[i]]+b[i]);
}
}
cout<<m+5-MAX-dp[m]<<endl;
}
else
cout<<m<<endl;
}
}